我已经在我的Java应用程序中实现了订阅。添加新订阅者时,应用程序会创建新任务(实现要在单独线程中运行的Runnable
的类),并将其添加到ExecutorService
中,如下所示:
public void Subscribe()
{
es_.execute(new Subscriber(this, queueName, handler));
}
//...
private ExecutorService es_;
应用程序可以根据需要注册任意数量的订阅者。现在我想实现类似 Unsubscribe
的东西,以便每个订阅者都能够停止消息流。在这里,我需要一种方法来停止ExecutorService
中运行的任务之一。但我不知道我该怎么做。
ExecutorService.shutdown()
及其变体不适合我:它们终止所有任务,我只想终止其中一个。我正在寻找解决方案。尽可能简单。谢谢。
ExecutorService#submit 而不是 execute
并使用返回的 Future
对象尝试使用 Future#cancel 取消任务
示例(假设Subscriber
是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.
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.htmlhttp://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html