29 |
|
static class DirectExecutorService extends AbstractExecutorService { |
30 |
|
public void execute(Runnable r) { r.run(); } |
31 |
|
public void shutdown() { shutdown = true; } |
32 |
< |
public List<Runnable> shutdownNow() { shutdown = true; return Collections.EMPTY_LIST; } |
32 |
> |
public List<Runnable> shutdownNow() { |
33 |
> |
shutdown = true; |
34 |
> |
return Collections.EMPTY_LIST; |
35 |
> |
} |
36 |
|
public boolean isShutdown() { return shutdown; } |
37 |
|
public boolean isTerminated() { return isShutdown(); } |
38 |
< |
public boolean awaitTermination(long timeout, TimeUnit unit) { return isShutdown(); } |
38 |
> |
public boolean awaitTermination(long timeout, TimeUnit unit) { |
39 |
> |
return isShutdown(); |
40 |
> |
} |
41 |
|
private volatile boolean shutdown = false; |
42 |
|
} |
43 |
|
|
217 |
|
|
218 |
|
|
219 |
|
/** |
220 |
< |
* Blocking on submit(callable) throws InterruptedException if |
216 |
< |
* caller interrupted. |
220 |
> |
* submit(callable).get() throws InterruptedException if interrupted |
221 |
|
*/ |
222 |
|
public void testInterruptedSubmit() throws InterruptedException { |
223 |
< |
final ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,60, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10)); |
224 |
< |
Thread t = new Thread(new CheckedInterruptedRunnable() { |
225 |
< |
public void realRun() throws Exception { |
226 |
< |
p.submit(new CheckedCallable<Object>() { |
227 |
< |
public Object realCall() |
228 |
< |
throws InterruptedException { |
229 |
< |
Thread.sleep(SMALL_DELAY_MS); |
230 |
< |
return null; |
231 |
< |
}}).get(); |
232 |
< |
}}); |
233 |
< |
|
234 |
< |
t.start(); |
235 |
< |
Thread.sleep(SHORT_DELAY_MS); |
236 |
< |
t.interrupt(); |
237 |
< |
joinPool(p); |
223 |
> |
final CountDownLatch submitted = new CountDownLatch(1); |
224 |
> |
final CountDownLatch quittingTime = new CountDownLatch(1); |
225 |
> |
final ExecutorService p |
226 |
> |
= new ThreadPoolExecutor(1,1,60, TimeUnit.SECONDS, |
227 |
> |
new ArrayBlockingQueue<Runnable>(10)); |
228 |
> |
final Callable<Void> awaiter = new CheckedCallable<Void>() { |
229 |
> |
public Void realCall() throws InterruptedException { |
230 |
> |
quittingTime.await(); |
231 |
> |
return null; |
232 |
> |
}}; |
233 |
> |
try { |
234 |
> |
Thread t = new Thread(new CheckedInterruptedRunnable() { |
235 |
> |
public void realRun() throws Exception { |
236 |
> |
Future<Void> future = p.submit(awaiter); |
237 |
> |
submitted.countDown(); |
238 |
> |
future.get(); |
239 |
> |
}}); |
240 |
> |
t.start(); |
241 |
> |
submitted.await(); |
242 |
> |
t.interrupt(); |
243 |
> |
t.join(); |
244 |
> |
} finally { |
245 |
> |
quittingTime.countDown(); |
246 |
> |
joinPool(p); |
247 |
> |
} |
248 |
|
} |
249 |
|
|
250 |
|
/** |
251 |
< |
* get of submitted callable throws InterruptedException if callable |
252 |
< |
* interrupted |
251 |
> |
* get of submitted callable throws InterruptedException if callable |
252 |
> |
* interrupted |
253 |
|
*/ |
254 |
|
public void testSubmitIE() throws InterruptedException { |
255 |
|
final ThreadPoolExecutor p = |
270 |
|
} |
271 |
|
|
272 |
|
/** |
273 |
< |
* get of submit(callable) throws ExecutionException if callable |
274 |
< |
* throws exception |
273 |
> |
* get of submit(callable) throws ExecutionException if callable |
274 |
> |
* throws exception |
275 |
|
*/ |
276 |
|
public void testSubmitEE() throws InterruptedException { |
277 |
|
ThreadPoolExecutor p = |