gpt4 book ai didi

java - 使用具有无限 while 循环的多个线程优雅地关闭程序

转载 作者:行者123 更新时间:2023-11-29 05:44:15 27 4
gpt4 key购买 nike

我有一个创建 10 个线程的程序,每个线程都有一个无限运行的 while 循环。我需要帮助来有效地实现可以有效停止所有线程的 Shutdown Hook 。因为我想正常关闭每个线程,一旦发现停止标志变为 TRUE,它就应该完成。

public class SampleGSH implements Runnable{
private static boolean stop = false;
public static void main(String[] args) {
for(int i = 0; i < 10;i++) {
Thread t = new Thread(new SampleGSH(), "name"+i);
t.start();
}
}

@Override
public void run() {
Runtime.getRuntime().addShutdownHook(new Thread("shutdown thread") {
public void run()
{
System.out.println("*******");
synchronized (this)
{
System.out.println("Turning switch off");
stop = true;
}
}
});

synchronized (this) {
while(!stop)
{
//Some logic which should not be killed abruptly once it starts running, a graceful shut down will not allow this code to start
}
}
}
}

我们将不胜感激任何帮助。

最佳答案

I need help to efficiently implement a Shutdown hook which can effectively STOP all the threads.

如果您有任何在多个线程之间共享的字段,则需要同步它们。在这种情况下,您的stop 应该是volatile。如果没有这个,就没有什么可以确保线程将看到 stop 的值更改为 true。参见 this tutorial有关原子访问的信息。

参见:Using boolean var for stopping threads

其他一些评论:

  • 如果您启动了多个线程,您应该考虑使用 ExecutorService

  • 您的 while 循环位于 synchronized block 内。这什么都不做,stop 字段将不会同步内存,因为它在 block 内部进行了外部更新。

  • 停止线程的另一种方法是interrupt()。参见 this tutorial .

      while (!thread.currentThread().isInterrupted()) {
    ...
    }
    ...
    t.interrupt();

关于java - 使用具有无限 while 循环的多个线程优雅地关闭程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16387748/

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