如何将一个线程提交给执行者服务并用Java中断它

Ami*_*wal 4 java multithreading executorservice

我有一个执行器服务,我提交多个线程做一些工作,现在我想取消/中断一些线程的执行,让我知道我怎么能这样做?

例如: - 下面是我的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");
        e.printStackTrace();
    }
}
}
Run Code Online (Sandbox Code Playgroud)

现在我将通过给它们命名来创建多个线程,以便稍后我可以中断该特定线程并停止执行.

现在在我的Test类中,我创建了4个线程,并希望停止执行名为amitk的2个线程.

public class ThreadTest {

public static void main(String[] args) {
    ExecutorService executorService = Executors.newCachedThreadPool();
    MyThread amit = new MyThread("amit");
    MyThread k = new MyThread("k");
    MyThread blr = new MyThread("blr");
    MyThread india = new MyThread("india");
    executorService.submit(amit);
    executorService.submit(k);
    executorService.submit(blr);
    executorService.submit(india);

    // now i want to stop the execution of thread Named "amit" and "k". 
}
}
Run Code Online (Sandbox Code Playgroud)

让我知道我该怎么做?

And*_*ner 9

你的MyThreads实际上并没有在带有这些名字的线程上运行.它们不是直接作为线程运行,而是在线程上运行ExecutorService.

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

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

然后,取消amit:

map.get("amit").cancel(true);
Run Code Online (Sandbox Code Playgroud)

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

Future<?> amitFuture = executorService.submit(amit);
amitFuture.cancel(true);
Run Code Online (Sandbox Code Playgroud)

但如果你有很多变数,这可能会很笨拙.