Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 主线程中的run()方法完成后,我的程序不会停止_Java_Multithreading_Timer - Fatal编程技术网

Java 主线程中的run()方法完成后,我的程序不会停止

Java 主线程中的run()方法完成后,我的程序不会停止,java,multithreading,timer,Java,Multithreading,Timer,我正在使用Java。主线程发送数据,而工作线程侦听响应。我也有定时器,以防超时发生。在main()中,我调用run(),它可以根据输出完成。下面是它的外观: class Send { Worker w; run() { // w was initialized in constructor w.start(); .... w.join(); } main(args) { Send

我正在使用Java。主线程发送数据,而工作线程侦听响应。我也有定时器,以防超时发生。在main()中,我调用run(),它可以根据输出完成。下面是它的外观:

class Send {
    Worker w;

    run() {
        // w was initialized in constructor
        w.start();
        ....
        w.join();
    }

    main(args) {
        Send s = new Send();
        s.run();
    }
    private class Worker extend Thread {
        public void run() {
            ....
        }
    }
} 
在s.run()中,每次需要取消计时器或重新启动计时器时,我都会这样做

timer.cancel();
timer.purge();
timer = new Timer();
timer.schdule(...);
TimerTask只是在Send中调用一个静态方法来处理超时。 那么,我做错了什么,导致我的程序在主线程完成后挂起? 多谢各位


编辑:输出
kill-3进程id

Full thread dump OpenJDK 64-Bit Server VM (19.0-b09 mixed mode):

"DestroyJavaVM" prio=10 tid=0x00007f9f20035000 nid=0x73f1 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Timer-10" prio=10 tid=0x0000000001a7d800 nid=0x740f in Object.wait() [0x00007f9f1e39c000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x000000075833fe78> (a java.util.TaskQueue)
    at java.lang.Object.wait(Object.java:502)
    at java.util.TimerThread.mainLoop(Timer.java:505)
    - locked <0x000000075833fe78> (a java.util.TaskQueue)
    at java.util.TimerThread.run(Timer.java:484)

"Low Memory Detector" daemon prio=10 tid=0x00007f9f20004800 nid=0x7402 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"CompilerThread1" daemon prio=10 tid=0x0000000001a70000 nid=0x7401 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"CompilerThread0" daemon prio=10 tid=0x00007f9f20001000 nid=0x7400 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x0000000001a6e800 nid=0x73ff waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=10 tid=0x0000000001a49000 nid=0x73fe in Object.wait() [0x00007f9f1f3f2000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000007580b1310> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:133)
    - locked <0x00000007580b1310> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:149)
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:177)

"Reference Handler" daemon prio=10 tid=0x0000000001a47000 nid=0x73fd in Object.wait() [0x00007f9f1f4f3000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000007580b11e8> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:502)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
    - locked <0x00000007580b11e8> (a java.lang.ref.Reference$Lock)

"VM Thread" prio=10 tid=0x0000000001a40000 nid=0x73fc runnable 

"GC task thread#0 (ParallelGC)" prio=10 tid=0x00000000019d7000 nid=0x73f2 runnable 

"GC task thread#1 (ParallelGC)" prio=10 tid=0x00000000019d9000 nid=0x73f3 runnable 

"GC task thread#2 (ParallelGC)" prio=10 tid=0x00000000019da800 nid=0x73f4 runnable 

"GC task thread#3 (ParallelGC)" prio=10 tid=0x00000000019dc800 nid=0x73f5 runnable 

"GC task thread#4 (ParallelGC)" prio=10 tid=0x00000000019de800 nid=0x73f6 runnable 

"GC task thread#5 (ParallelGC)" prio=10 tid=0x00000000019e0000 nid=0x73f7 runnable 

"GC task thread#6 (ParallelGC)" prio=10 tid=0x00000000019e2000 nid=0x73f8 runnable 

"GC task thread#7 (ParallelGC)" prio=10 tid=0x00000000019e4000 nid=0x73f9 runnable 

"GC task thread#8 (ParallelGC)" prio=10 tid=0x00000000019e5800 nid=0x73fa runnable 

"GC task thread#9 (ParallelGC)" prio=10 tid=0x00000000019e7800 nid=0x73fb runnable 

"VM Periodic Task Thread" prio=10 tid=0x00007f9f20007800 nid=0x7403 waiting on condition 

JNI global references: 886

Heap
 PSYoungGen      total 150528K, used 7745K [0x00000007580b0000, 0x00000007628a0000, 0x0000000800000000)
  eden space 129088K, 6% used [0x00000007580b0000,0x00000007588405b8,0x000000075fec0000)
  from space 21440K, 0% used [0x00000007613b0000,0x00000007613b0000,0x00000007628a0000)
  to   space 21440K, 0% used [0x000000075fec0000,0x000000075fec0000,0x00000007613b0000)
 PSOldGen        total 343936K, used 0K [0x0000000608200000, 0x000000061d1e0000, 0x00000007580b0000)
  object space 343936K, 0% used [0x0000000608200000,0x0000000608200000,0x000000061d1e0000)
 PSPermGen       total 21248K, used 3130K [0x00000005fdc00000, 0x00000005ff0c0000, 0x0000000608200000)
  object space 21248K, 14% used [0x00000005fdc00000,0x00000005fdf0ea30,0x00000005ff0c0000)
完整线程转储OpenJDK 64位服务器VM(19.0-b09混合模式):
“DestroyJavaVM”优先级=10 tid=0x00007f9f20035000 nid=0x73f1等待条件[0x0000000000000000]
java.lang.Thread.State:可运行
对象中的“计时器-10”优先级=10 tid=0x0000000001a7d800 nid=0x740f。等待()[0x00007f9f1e39c000]
java.lang.Thread.State:正在等待(在对象监视器上)
在java.lang.Object.wait(本机方法)
-等待(java.util.TaskQueue)
在java.lang.Object.wait(Object.java:502)
位于java.util.TimerThread.mainLoop(Timer.java:505)
-锁定(java.util.TaskQueue)
在java.util.TimerThread.run(Timer.java:484)
“低内存检测器”守护程序prio=10 tid=0x00007f9f20004800 nid=0x7402可运行[0x0000000000000000]
java.lang.Thread.State:可运行
“CompilerThread1”守护程序prio=10 tid=0x0000000001a7000nid=0x7401等待条件[0x0000000000000000]
java.lang.Thread.State:可运行
“CompilerThread0”守护进程prio=10 tid=0x00007f9f20001000 nid=0x7400等待条件[0x0000000000000000]
java.lang.Thread.State:可运行
“信号调度器”守护程序prio=10 tid=0x0000000001a6e800 nid=0x73ff等待条件[0x0000000000000000]
java.lang.Thread.State:可运行
对象中的“终结器”守护程序prio=10 tid=0x0000000001a49000 nid=0x73fe.wait()[0x00007f9f1f3000]
java.lang.Thread.State:正在等待(在对象监视器上)
在java.lang.Object.wait(本机方法)
-等待(java.lang.ref.ReferenceQueue$Lock)
位于java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:133)
-锁定(java.lang.ref.ReferenceQueue$Lock)
位于java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:149)
位于java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:177)
对象中的“引用处理程序”守护程序prio=10 tid=0x0000000001a47000 nid=0x73fd.wait()[0x00007f9f4f3000]
java.lang.Thread.State:正在等待(在对象监视器上)
在java.lang.Object.wait(本机方法)
-等待(java.lang.ref.Reference$Lock)
在java.lang.Object.wait(Object.java:502)
在java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
-锁定(一个java.lang.ref.Reference$Lock)
“VM线程”优先级=10 tid=0x0000000001a40000 nid=0x73fc可运行
“GC任务线程#0(并行GC)”优先级=10 tid=0x00000000019d7000 nid=0x73f2可运行
“GC任务线程#1(并行GC)”优先级=10 tid=0x00000000019d9000 nid=0x73f3可运行
“GC任务线程#2(并行GC)”优先级=10 tid=0x00000000019da800 nid=0x73f4可运行
“GC任务线程#3(并行GC)”优先级=10 tid=0x00000000019dc800 nid=0x73f5可运行
“GC任务线程4(并行GC)”优先级=10 tid=0x00000000019de800 nid=0x73f6可运行
“GC任务线程#5(并行GC)”优先级=10 tid=0x00000000019e0000 nid=0x73f7可运行
“GC任务线程#6(并行GC)”优先级=10 tid=0x00000000019e2000 nid=0x73f8可运行
“GC任务线程#7(并行GC)”优先级=10 tid=0x00000000019e4000 nid=0x73f9可运行
“GC任务线程#8(并行GC)”优先级=10 tid=0x00000000019e5800 nid=0x73fa可运行
“GC任务线程#9(并行GC)”优先级=10 tid=0x00000000019e7800 nid=0x73fb可运行
“VM定期任务线程”优先级=10 tid=0x00007f9f20007800 nid=0x7403等待状态
JNI全球参考:886
堆
PSYoungGen总计150528K,使用7745K[0x00000007580b0000,0x00000007628a0000,0x000000080000000)
eden空间129088K,已使用6%[0x00000007580b0000,0x00000007588405b8,0x000000075fec0000)
从空间21440K中,0%已使用[0x00000007613b0000,0x00000007613b0000,0x00000007628a0000)
对于空间21440K,使用了0%[0x000000075fec0000,0x000000075fec0000,0x00000007613b0000)
PSOldGen总计343936K,已使用0K[0x0000000608200000,0x000000061D110000,0x00000007580b0000)
对象空间343936K,已使用0%[0x0000000608200000,0x0000000608200000,0x000000061D110000)
PSPermGen总计21248K,使用3130K[0x00000005fdc00000,0x00000005FF0C00000,0x0000000608200000)
对象空间21248K,已使用14%[0x00000005fdc00000,0x00000005fdf0ea30,0x00000005FF0C00000)

Java程序将在最后一个线程完成后退出


为了防止出现这种情况,请将其他线程标记为守护进程线程。

在最后一个线程完成后,Java程序将退出


要防止出现这种情况,请将其他线程标记为守护进程线程。

通过运行
kill-3
获得线程转储。这将告诉您哪些线程挂起并阻止java进程退出。请随时发布(其中一些线程)线程转储&people可以帮助您确定下一步要做什么。

通过运行
kill-3
获得线程转储。这将告诉您哪些线程挂起并阻止java进程退出。请随意发布(部分)线程转储&people可以帮助您确定下一步要做什么。

看起来您正在创建几个计时器线程。请检查它们是否都已正确退出,这可能就是问题所在

如果您检查计时器JavaDoc,您将注意到以下注意事项:

默认情况下,任务执行线程不作为守护进程线程运行


您可以使用调试器(Eclipse和NetBeans都有优秀的调试器)查看哪些线程仍然处于活动状态。

看起来您正在创建多个计时器线程。请检查它们是否都已正确退出,这可能是问题所在

如果您检查计时器JavaDoc,您将注意到以下注意事项:

默认情况下,任务执行线程不运行