如何将线程提交给执行者服务并在 Java 中中断它
How to get a thread submitted to executer service and interrupt it in Java
我有一个执行器服务,我想cancel/interrupt执行一些线程。
例如:下面是我的线程 class,它会在某个时间间隔后无限地打印线程名称。
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 个线程并希望停止执行名为 foo 和 bar 的 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("foo", executorService.submit(foo));
map.put("bar", executorService.submit(bar));
// ... etc
然后,取消foo
:
map.get("amit").cancel(true);
当然,您可以简单地保留显式变量:
Future<?> fooFuture = executorService.submit(foo);
fooFuture.cancel(true);
但如果你有很多变量,这可能会很笨拙。
我有一个执行器服务,我想cancel/interrupt执行一些线程。
例如:下面是我的线程 class,它会在某个时间间隔后无限地打印线程名称。
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 个线程并希望停止执行名为 foo 和 bar 的 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("foo", executorService.submit(foo));
map.put("bar", executorService.submit(bar));
// ... etc
然后,取消foo
:
map.get("amit").cancel(true);
当然,您可以简单地保留显式变量:
Future<?> fooFuture = executorService.submit(foo);
fooFuture.cancel(true);
但如果你有很多变量,这可能会很笨拙。