如何获取提交到执行程序服务的线程并在 Java 中中断它



我有一个执行器服务,我想取消/中断某些线程的执行。

例如:下面是我的 Thread 类,它在一段时间后无限打印线程名称。

public class MyThread implements Runnable {
String name;
public MyThread(String name) {
this.name = name;
}
@Override
public void run() {
try {
System.out.println("Thread "+ name + " is running");
sleep(500);
}catch (InterruptedException e){
System.out.println("got the interrupted signal");
}
}
}

现在,我将通过为它们命名来创建多个线程,以便稍后我可以使用其名称停止特定线程。

如下所示,我正在创建 4 个线程,并希望停止执行名为foobar的 2 个线程。

public class ThreadTest {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
MyThread amit = new MyThread("foo");
MyThread k = new MyThread("bar");
MyThread blr = new MyThread("tel-aviv");
MyThread india = new MyThread("israel");
executorService.submit(foo);
executorService.submit(bar);
executorService.submit(tel-aviv);
executorService.submit(israel);
}
}

您的MyThread实际上并没有在具有这些名称的线程上运行。它们不是直接作为线程运行的,而是在ExecutorService的线程上运行的。

因此,您需要保留名称到Future的映射,然后在需要时取消将来。

Map<String, Future<?>> map = new HashMap<>();
map.put("amit", executorService.submit(amit));
map.put("k", executorService.submit(k));
// ... etc

然后,要取消amit

map.get("amit").cancel(true);

当然,您可以简单地保留显式变量:

Future<?> amitFuture = executorService.submit(amit);
amitFuture.cancel(true);

但是,如果您有很多变量,这可能会很笨拙。

相关内容

  • 没有找到相关文章

最新更新