程序在多线程中没有顺利结束

Posted

技术标签:

【中文标题】程序在多线程中没有顺利结束【英文标题】:program is not ending smoothly in multithreading 【发布时间】:2013-05-19 16:33:16 【问题描述】:

我在我的程序中创建了一些线程。这里我使用了 join 方法,以便主线程将等待我的所有线程。但是每当我运行这个程序时,它并没有完成所有的信息消息被打印但仍然程序没有顺利结束。谁能帮我摆脱困境?

下面是我的代码:

ArrayList<DeployerThread> threadsarrforjoin = new ArrayList<DeployerThread>();

for (int i = 0; i < serverList.size(); i++) 
    logger.debug("Inside for loop of buildParameterList()");
    if (serverList.get(i).ServerType.toString().equalsIgnoreCase("SS") &&
        serverList.get(i).GroupNo.toString().equalsIgnoreCase(groupNo)) 
        try 
            nameofthreads.add("PhoinexHyperlink[" +
                               serverList.get(i).ServerIP + "_" +
                               serverList.get(i).ServerType + "]");
            DeployerThread deployerThread = new DeployerThread(serverList.get(i), action);
            logger.info("---- Start thread execution ---- ");
            deployerThread.start();
            threadsarrforjoin.add(deployerThread);

            Thread.sleep(5000);
         catch (Exception e) 
            System.out.println(e);
            this.logger.error(e.toString());
          
        count++;
    


for (int i = 0; i < threadsarrforjoin.size(); i++) 
    try 
        this.threadsarrforjoin.get(i).join();
     catch (InterruptedException ex) 
        logger.error(ex.getMessage());
        Logger.getLogger(StartStopWebServers.class.getName()).log(Level.SEVERE, null, ex);
      

logger.info(taskName + " Completed");

下面是 DeployerThread 的代码:

public DeployerThread(ServerConfig serverConfig, String actn, String WEBPROC, String WEBPROC1, String WEBPROCIgnore) 
            logger.debug("Inside DeployerThread constructor");
            logger.debug("serverConfig=" + serverConfig);
            logger.debug("Action=" + actn);
            setServerConfig(serverConfig);
            setTaskaction(actn);
            setWebproc(WEBPROC);
            setWebproc1(WEBPROC1);
            setWebprocignore(WEBPROCIgnore);


        

        public final ServerConfig getServerConfig() 
            return serverConfig;
        

        public final void setServerConfig(ServerConfig serverConfig) 
            this.serverConfig = serverConfig;
        

        public void run() 

            logger.debug("Inside threads run method : Start");
            count++;
            logger.debug("Thread number >>>>" + count + "<<<<");


            Thread.currentThread().setName("[" + serverConfig.ServerIP + "_" + serverConfig.ServerType + "]");
           // threadsarrforjoin.add(Thread.currentThread());
            logger.debug("Name given to this thread=" + "[" + serverConfig.ServerIP + "_" + serverConfig.ServerType + "]");
            org.slf4j.MDC.put("userid", buildPath + "/" + taskName + "/" + taskaction + "_" + Thread.currentThread().getName() + ".log");

            logger.info("Deployment started on " + serverConfig.ServerIP + " for " + serverConfig.ServerType + " at " + dateTimeStamp);
            logger.debug("taskname=" + taskName + "_" + serverConfig.ServerType);

            logger.debug("buildPath=" + buildPath);
            runSSH(serverConfig, action, webproc, webproc1, webprocignore);
            logger.debug("Outside threads run method : End");



        
    

下面是线程转储:

全线程转储 Java HotSpot(TM) Server VM(1.5.0_30-b03 混合模式):

“DestroyJavaVM”prio=3 tid=0x00037840 nid=0x1 等待条件 [0x00000000..0xffbfe3d0]

“连接线程 172.24.85.166 会话”prio=3 tid=0x006bcdb0 nid=0x25 可运行 [0xb29af000..0xb29afbf0] 在 java.net.SocketInputStream.socketRead0(本机方法) 在 java.net.SocketInputStream.read(SocketInputStream.java:129) 在 com.jcraft.jsch.IO.getByte(IO.java:82) 在 com.jcraft.jsch.Session.read(Session.java:860) 在 com.jcraft.jsch.Session.run(Session.java:1330) 在 java.lang.Thread.run(Thread.java:637)

“内存不足检测器”守护进程 prio=3 tid=0x002e6fc8 nid=0x22 可运行 [0x00000000..0x00000000]

“CompilerThread1”守护进程 prio=3 tid=0x002e5130 nid=0x21 等待条件 [0x00000000..0xb3aee9bc]

“CompilerThread0”守护进程 prio=3 tid=0x002e4310 nid=0x20 等待条件 [0x00000000..0xb3b7ea84]

“AdapterThread”守护进程prio=3 tid=0x002e34f0 nid=0x1f 等待条件[0x00000000..0x00000000]

“信号调度程序”守护进程 prio=3 tid=0x002e2738 nid=0x1e 等待条件 [0x00000000..0x00000000]

“终结器”守护进程 prio=3 tid=0x002d8d68 nid=0x1d in Object.wait() [0xb3d2f000..0xb3d2fbf0] 在 java.lang.Object.wait(本机方法) - 等待 (一个 java.lang.ref.ReferenceQueue$Lock) 在 java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:120) - 锁定 (一个 java.lang.ref.ReferenceQueue$Lock) 在 java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:136) 在 java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

“引用处理程序”守护进程 prio=3 tid=0x002d7648 nid=0x1c in Object.wait() [0xb3dbf000..0xb3dbfc70] 在 java.lang.Object.wait(本机方法) - 等待 (java.lang.ref.Reference$Lock) 在 java.lang.Object.wait(Object.java:474) 在 java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116) - 锁定 (一个 java.lang.ref.Reference$Lock)

“VM 线程”prio=3 tid=0x002d3c60 nid=0x1b 可运行

“GC 任务线程#0 (ParallelGC)”prio=3 tid=0x000ba278 nid=0x2 可运行

“GC 任务线程#1 (ParallelGC)”prio=3 tid=0x000bacc0 nid=0x3 可运行

“GC 任务线程#2 (ParallelGC)”prio=3 tid=0x000bb708 nid=0x4 可运行

“GC 任务线程#3 (ParallelGC)”prio=3 tid=0x000bc150 nid=0x5 可运行

“GC 任务线程#4 (ParallelGC)”prio=3 tid=0x000bcb98 nid=0x6 可运行

“GC 任务线程#5 (ParallelGC)”prio=3 tid=0x000bd5e0 nid=0x7 可运行

“GC 任务线程#6 (ParallelGC)”prio=3 tid=0x000be830 nid=0x8 可运行

“GC 任务线程#7 (ParallelGC)”prio=3 tid=0x000bf278 nid=0x9 可运行

“GC 任务线程#8 (ParallelGC)”prio=3 tid=0x000bfcc0 nid=0xa 可运行

“GC 任务线程#9 (ParallelGC)”prio=3 tid=0x000c0730 nid=0xb 可运行

“GC 任务线程#10 (ParallelGC)”prio=3 tid=0x000c1178 nid=0xc 可运行

“GC 任务线程#11 (ParallelGC)”prio=3 tid=0x000c1bc0 nid=0xd 可运行

“GC 任务线程#12 (ParallelGC)”prio=3 tid=0x000c2608 nid=0xe runnable

“GC 任务线程#13 (ParallelGC)”prio=3 tid=0x000c3050 nid=0xf 可运行

“GC 任务线程#14 (ParallelGC)”prio=3 tid=0x000c3a98 nid=0x10 可运行

“GC 任务线程#15 (ParallelGC)”prio=3 tid=0x000c44e0 nid=0x11 可运行

“GC 任务线程#16 (ParallelGC)”prio=3 tid=0x000c4f30 nid=0x12 可运行

“GC 任务线程#17 (ParallelGC)”prio=3 tid=0x000c5978 nid=0x13 可运行

“GC 任务线程#18 (ParallelGC)”prio=3 tid=0x000c63c0 nid=0x14 可运行

“GC 任务线程#19 (ParallelGC)”prio=3 tid=0x000c6e08 nid=0x15 可运行

“GC 任务线程#20 (ParallelGC)”prio=3 tid=0x000c7850 nid=0x16 可运行

“GC 任务线程#21 (ParallelGC)”prio=3 tid=0x000c8298 nid=0x17 可运行

“GC 任务线程#22 (ParallelGC)”prio=3 tid=0x000c8ce0 nid=0x18 可运行

“GC 任务线程#23 (ParallelGC)”prio=3 tid=0x000c9728 nid=0x19 可运行

“GC 任务线程#24 (ParallelGC)”prio=3 tid=0x000ca170 nid=0x1a 可运行

“VM 周期性任务线程”prio=3 tid=0x000b1820 nid=0x23 等待条件

【问题讨论】:

如需尽快获得更好的帮助,请发帖SSCCE。 “结局不顺利”是什么意思?你到底期待什么?你的程序输出什么?截至目前,我不知道问题是什么。 “没有顺利结束”意味着程序正在完全执行,但似乎它仍在等待某些东西。控制权没有返回。在这里我想确保在这种情况下加入正常工作?因为我认为它在等待无限的时间。 你能否在程序处于该状态时进行线程转储(ctrl+break 或使用 jstack)并发布它。也可以包含 DeployerThread 的代码。 嗨 gkamal...我已经用 DeployerThread 代码编辑了我的问题,还添加了线程转储。请检查。 【参考方案1】:

看来你用 JSCH 打开的 ssh 访问没有终止;非守护线程Connect thread 仍然存在。如果如您所说您的程序运行正常,请务必断开与 jsch 会话的连接。

您也可以将会话上的DaemonThread 属性设置为true,以避免由ConnectThread session.setDaemonThread(true) 引起的挂起。必须在connect() 之前调用。

【讨论】:

以上是关于程序在多线程中没有顺利结束的主要内容,如果未能解决你的问题,请参考以下文章

C:在多线程程序中使用clock()测量时间

为啥在多线程应用程序 C++ 中没有发生同步

Java遨游在多线程的知识体系中

Java遨游在多线程的知识体系中

delphi 的多线程问题

有没有办法在多线程应用程序中安全地使用 errno? [复制]