停止提交给ExecutorService的Runnable

mav*_*rik 8 java executorservice

我在我的Java应用程序中实现了订阅.添加新订户时,应用程序会创建新任务(实现Runnable在单独的线程中运行的类)并将其添加到以下内容中ExecutorService:

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

//...

private ExecutorService es_;
Run Code Online (Sandbox Code Playgroud)

应用程序可以根据需要注册多个订阅者.现在我希望实现类似的东西Unsubscribe,每个订阅者都有能力停止消息流.在这里,我需要一种方法来阻止其中一个任务运行ExecutorService.但我不知道怎么做到这一点.

ExecutorService.shutdown()和它的变化不适合我:它们终止所有任务,我想终止它们中的一个.我正在寻找解决方案.尽可能简单.谢谢.

Avi*_*gal 10

您可以使用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
Run Code Online (Sandbox Code Playgroud)

评论中的重要说明:

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

  • 注意:如果您的任务不支持中断并且它已经启动,它将运行完成. (5认同)
  • @ataulm interrupt()设置一个标志.如果代码没有检查标志或调用一个方法,它只是一个标志. (3认同)