gpt4 book ai didi

Java 线程池,如何使用 shutdownNow() 立即停止长时间运行的线程?

转载 作者:行者123 更新时间:2023-11-30 10:48:18 25 4
gpt4 key购买 nike

我有一个使用 Executors 创建多个线程的主线程

ExecutorService executor = Executors.newFixedThreadPool(4);

每个线程都有可能运行数小时的长时间运行的作业(来自另一个团队的一些遗留代码)。

现在我想使用

从主线程关闭
executor.shutdownNow()

我希望线程能够立即停止,我该怎么做?

在线程中,假设我们有这样的代码:

public void run() {
doA();
doB();
doC();
...
...

现在我的问题是,即使我调用了shutdownNow,正在运行的线程也会运行到最后然后停止。我想知道如何停止和退出。

最佳答案

这确实是一个有点棘手的情况!

我们能否利用 JDK 以 ThreadFactory 的形式提供的 Hook ,当关联的线程池正在创建您的遗留任务将在其中运行的线程时,会查询该 Hook ?如果是,那么为什么不让您的遗留代码在 daemon 线程中运行?我们知道,当最后一个 non-daemon 线程退出时,JVM 就退出了。因此,如果我们将线程池用于运行遗留任务的每个线程都设为守护线程,我们就有可能使 shutdownNow() 调用更具响应性:

public class LegacyCodeExecutorEx {
public static void main(String[] args) throws InterruptedException {

ExecutorService executor = Executors.newFixedThreadPool(2, new DaemonThreadFactory());

executor.submit(new LegacySimulator());
Thread.sleep(1000);
executor.shutdownNow();
}

static class LegacySimulator implements Runnable {
private final AtomicLong theLong;
LegacySimulator() {
theLong = new AtomicLong(1);
}
@Override
public void run() {
for (long i = 10; i < Long.MAX_VALUE; i++) {
theLong.set(i*i);
}
System.out.println("Done!");
}
}
static class DaemonThreadFactory implements ThreadFactory {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setName("Daemon Thread");
t.setDaemon(true);
return t;
}
}
}

如果你玩 setDaemon(true) 行,你会看到这段代码要么响应主线程(非守护进程)的退出要么立即或花时间完成任务。

是否有可能让您的遗留代码运行线程 daemon threads 成为可能?如果是,您可以尝试一下。

关于Java 线程池,如何使用 shutdownNow() 立即停止长时间运行的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35852606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com