【发布时间】:2012-08-21 17:48:09
【问题描述】:
如果我有一个 ExecutorService 来提供 Runnable 任务,我可以选择一个并中断它吗?
我知道我可以取消返回的 Future(也提到了Here: how-to-interrupt-executors-thread),但我怎样才能提出InterruptedException。 Cancel 似乎没有这样做(事件虽然应该通过查看源代码,但 OSX 实现可能不同)。至少这个 sn-p 不打印 'it!'也许我误解了某些东西,不是自定义可运行对象导致异常?
public class ITTest {
static class Sth {
public void useless() throws InterruptedException {
Thread.sleep(3000);
}
}
static class Runner implements Runnable {
Sth f;
public Runner(Sth f) {
super();
this.f = f;
}
@Override
public void run() {
try {
f.useless();
} catch (InterruptedException e) {
System.out.println("it!");
}
}
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService es = Executors.newCachedThreadPool();
Sth f = new Sth();
Future<?> lo = es.submit(new Runner(f));
lo.cancel(true);
es.shutdown();
}
}
【问题讨论】:
-
你不应该知道
ExecutorService是如何安排它的线程的。你怎么能取消其中的一个? -
你明白了,但如果我有某种生产者消费者模式,我应该能够通过中断来停止非响应线程,但我不能这样。或者我应该设计它以便 Future.cancel 有资格取消?
-
是的,@zeller,将其设计为与
Future.cancel()一起使用。这就是它的用途。
标签: java multithreading executorservice