10

我已经在我的 Java 应用程序中实现了订阅。当添加新订阅者时,应用程序创建新任务(实现Runnable在单独线程中运行的类)并将其添加到ExecutorService类似:

public void Subscribe()
{
    es_.execute(new Subscriber(this, queueName, handler));
}

//...

private ExecutorService es_;

应用程序可以注册任意数量的订阅者。现在我想实现这样的东西,Unsubscribe这样每个订阅者都有能力停止消息流。在这里,我需要一种方法来停止在ExecutorService. 但我不知道我该怎么做。

TheExecutorService.shutdown()及其变体不适合我:它们终止所有任务,我只想终止其中一个。我正在寻找解决方案。尽可能简单。谢谢。

4

2 回答 2

13

您可以使用ExecutorService#submit代替execute并使用返回的Future对象尝试使用Future#cancel 取消任务

示例(假设Subscriber是 a Runnable):

Future<?> future = es_.submit(new Subscriber(this, queueName, handler));
...
future.cancel(true); // true to interrupt if running

评论中的重要说明:

If your task doesn't honour interrupts and it has already started, it will run to completion.

于 2012-12-18T09:14:38.440 回答
3

而不是使用ExecutorService.execute(Runnable) 尝试使用Future<?> submit(Runnable). 此方法将提交Runnable到池中执行,并将返回一个Future对象。通过这样做,您将获得对所有订阅者线程的引用。

为了停止特定线程,只需使用futureObj.cancel(true). 这将中断正在运行的线程,抛出一个InterruptedException. 订阅者线程的编码方式应使其在出现此异常时停止处理(例如Thread.sleep(millis),使用整个方法的包装器 try / catch 块)。

您可以找到有关官方 API 的更多信息:http: //docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html http://docs.oracle.com/javase/6 /docs/api/java/util/concurrent/ExecutorService.html

于 2012-12-18T09:29:27.900 回答