停止提交到 ExecutorService 的可运行对象



我已经在我的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 取消任务

示例(假设SubscriberRunnable):

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

相关内容

  • 没有找到相关文章

最新更新