115 |
|
int ntasks = tasks.size(); |
116 |
|
if (ntasks == 0) |
117 |
|
throw new IllegalArgumentException(); |
118 |
< |
List<Future<T>> futures = new ArrayList<Future<T>>(ntasks); |
118 |
> |
ArrayList<Future<T>> futures = new ArrayList<Future<T>>(ntasks); |
119 |
|
ExecutorCompletionService<T> ecs = |
120 |
|
new ExecutorCompletionService<T>(this); |
121 |
|
|
173 |
|
throw ee; |
174 |
|
|
175 |
|
} finally { |
176 |
< |
for (Future<T> f : futures) |
177 |
< |
f.cancel(true); |
176 |
> |
for (int i = 0, size = futures.size(); i < size; i++) |
177 |
> |
futures.get(i).cancel(true); |
178 |
|
} |
179 |
|
} |
180 |
|
|
198 |
|
throws InterruptedException { |
199 |
|
if (tasks == null) |
200 |
|
throw new NullPointerException(); |
201 |
< |
List<Future<T>> futures = new ArrayList<Future<T>>(tasks.size()); |
201 |
> |
ArrayList<Future<T>> futures = new ArrayList<Future<T>>(tasks.size()); |
202 |
|
boolean done = false; |
203 |
|
try { |
204 |
|
for (Callable<T> t : tasks) { |
206 |
|
futures.add(f); |
207 |
|
execute(f); |
208 |
|
} |
209 |
< |
for (Future<T> f : futures) { |
209 |
> |
for (int i = 0, size = futures.size(); i < size; i++) { |
210 |
> |
Future<T> f = futures.get(i); |
211 |
|
if (!f.isDone()) { |
212 |
|
try { |
213 |
|
f.get(); |
220 |
|
return futures; |
221 |
|
} finally { |
222 |
|
if (!done) |
223 |
< |
for (Future<T> f : futures) |
224 |
< |
f.cancel(true); |
223 |
> |
for (int i = 0, size = futures.size(); i < size; i++) |
224 |
> |
futures.get(i).cancel(true); |
225 |
|
} |
226 |
|
} |
227 |
|
|
231 |
|
if (tasks == null) |
232 |
|
throw new NullPointerException(); |
233 |
|
long nanos = unit.toNanos(timeout); |
234 |
< |
List<Future<T>> futures = new ArrayList<Future<T>>(tasks.size()); |
234 |
> |
ArrayList<Future<T>> futures = new ArrayList<Future<T>>(tasks.size()); |
235 |
|
boolean done = false; |
236 |
|
try { |
237 |
|
for (Callable<T> t : tasks) |
238 |
|
futures.add(newTaskFor(t)); |
239 |
|
|
240 |
|
final long deadline = System.nanoTime() + nanos; |
241 |
+ |
final int size = futures.size(); |
242 |
|
|
243 |
|
// Interleave time checks and calls to execute in case |
244 |
|
// executor doesn't have any/much parallelism. |
245 |
< |
Iterator<Future<T>> it = futures.iterator(); |
246 |
< |
while (it.hasNext()) { |
245 |
< |
execute((Runnable)(it.next())); |
245 |
> |
for (int i = 0; i < size; i++) { |
246 |
> |
execute((Runnable)futures.get(i)); |
247 |
|
nanos = deadline - System.nanoTime(); |
248 |
|
if (nanos <= 0L) |
249 |
|
return futures; |
250 |
|
} |
251 |
|
|
252 |
< |
for (Future<T> f : futures) { |
252 |
> |
for (int i = 0; i < size; i++) { |
253 |
> |
Future<T> f = futures.get(i); |
254 |
|
if (!f.isDone()) { |
255 |
|
if (nanos <= 0L) |
256 |
|
return futures; |
268 |
|
return futures; |
269 |
|
} finally { |
270 |
|
if (!done) |
271 |
< |
for (Future<T> f : futures) |
272 |
< |
f.cancel(true); |
271 |
> |
for (int i = 0, size = futures.size(); i < size; i++) |
272 |
> |
futures.get(i).cancel(true); |
273 |
|
} |
274 |
|
} |
275 |
|
|