java - 停止提交给 ExecutorService 的 Runnable

标签 java 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 取消任务

示例(假设 Subscriber 是一个 Runnable):

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

评论中的重要说明:

如果您的任务不支持中断并且它已经开始,它将一直运行到完成。

关于java - 停止提交给 ExecutorService 的 Runnable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13929618/

相关文章:

java - 当ExecutorService ThreadFactory返回null而不是thead时如何处理

java - Mysql 的 Oracle 序列类似物

java - 将特定类型的第一个元素映射到字段

java - OnScaleGestureListener - 放大和缩小时

java - CompletableFuture 是否有 .thenCompose() 也异常执行?

java - Java 中使用 ExecutorService 的多线程代码无法返回,为什么?

java - ExecutorService 与 ThreadPoolExecutor 使用 LinkedBlockingQueue

java - 基于语言环境的 SimpleDateFormat 模式,但强制使用 4 位数年份

Java ExecutorService 关闭现在需要很长时间

java - 为什么 Executor Service Implementation 的 Pool count 会增加?