当前位置: 首页 > 面试题库 >

Java Shutdown挂钩未运行

刘畅
2023-03-14
问题内容

我是Java /线程的新手,并且继承了类似以下代码的内容。这是一个命令行程序,main()仅启动5-6种不同类型的线程,并以^
C退出。我想添加一个关闭钩子以正确关闭所有线程,并通过以下方式对其进行调整。

我在所有线程中添加了一个Shutdown钩子和一个stopThread()方法(例如MyWorker类中的一个)

问题是当我按^ CI时,看不到线程的run方法的结束消息。这是在后台完成的还是我的方法有问题?另外,我应该遵循更好的模式吗?

谢谢

 public class Main {
     public static MyWorker worker1 = new MyWorker();
     // .. various other threads here

     public static void startThreads() {
         worker1.start();
         // .. start other threads
     }

     public static void stopThreads() {
         worker1.stopThread();
         // .. stop other threads
     }

     public static void main(String[] args)
             throws Exception {

         startThreads();

         // TODO this needs more work (later)

         Runtime.getRuntime().addShutdownHook(new Thread() {
             @Override
             public void run() {
                 try {
                     stopThreads();
                 } catch (Exception exp) {

                 }
             }
         });
     } }

 public class MyWorker extends Thread {
     private volatile boolean stop = false;

     public void stopThread() {
         stop = true;
     }

     public void run() {
         while (!stop) {
             // Do stuff here
         }
         // Print exit message with logger
     } 
}

问题答案:

当您调用System.exit()或通过信号终止时,它将停止所有现有线程并启动所有关闭挂钩。也就是说,您的所有线程都可能在您启动钩子之前就死掉了。

您应该确保干净地关闭资源,而不是试图干净地停止线程。



 类似资料:
  • 我正在尝试使用状态将一个表单输入值复制到另一个表单输入值,但状态没有更新 我创建了一个带有按钮的表单,其中左侧表单输入的值应复制到右侧表单输入。这是我的代码: 无论我做什么,dbSecName的状态都不会改变。我试着设置一个新的常量。我尝试使onclick函数异步并等待。如果我为我试图设置的变量的值添加,我可以正确地看到它,但是dbSecName的console.log总是显示原始值。 我真的不知

  • 我正在尝试新的hooks功能,并坚持认为我的状态没有更新。 实际上,状态已更新(我可以在console.log中看到更新的值,并且我的组件会重新运行useEffect),但是useEffect方法使用我的旧状态,并仅将签名保存给第一个用户,而活动用户在状态中确实发生了更改。 我想过添加useCallback,并将我的方法移动到use效果或组件本身,但我可以设法让它工作。 状态: 这是我的效果: 这

  • 我试图设置一个基本的喜欢项目,类似于facebook喜欢当页面第一次呈现时是黑色的颜色,然后使用React钩子,useState()和use效应()来改变喜欢状态变化时的颜色。然而,我已经得到了渲染的颜色,但是它也在加载渲染,所以当用户点击“喜欢”并改变喜欢状态时,不会从黑色变成绿色。 所以,我想要类似的初始颜色

  • 问题内容: 我在程序中添加了以下代码: 但是,我没有看到该消息。附加信息:我正在Java 7的Netbeans IDE内部运行该程序。 编辑:我忘了补充说,有一个使程序保持活动状态的全局线程。我通过按Netbeans右下角的[x]来关闭它。 问题答案: JVM可以有序或突然关闭。关闭挂钩会运行以有序关闭:当最后一个线程终止时,有人呼叫或通过其他平台特定的方式(例如,按Ctrl-C)。 Shutdo

  • 问题内容: 我正在尝试使用urllib2 http客户端在python中创建下载进度栏。我已经查看了API(以及Google),似乎urllib2不允许您注册进度挂钩。但是,较旧的不推荐使用的urllib确实具有此功能。 有谁知道如何使用urllib2创建进度条或报告挂钩?还是有一些其他的黑客来获得类似的功能? 问题答案: 这是一个完全有效的示例,它建立在Anurag响应中的分块方法的基础上。我的

  • 更新状态的正确方式是什么,是一个嵌套对象,在与钩子反应? 如何使用将更新为(附加字段)? (更改值)?