当前位置: 首页 > 知识库问答 >
问题:

程序在多线程中不能顺利结束

吕霖
2023-03-14

我正在我的程序中创建一些线程。这里我使用了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");



        }
    }

下面是线程转储:

“CompilerThread0”后台进程Prio=3 TID=0x002E4310 NID=0x20正在等待条件[0x00000000.0xB3B7EA84]

“AdapterThread”后台进程Prio=3 TID=0x002E34F0 NID=0x1F正在等待条件[0x00000000.0x000000]

“Signal Dispatcher”后台进程Prio=3 TID=0x002E2738 NID=0x1E正在等待条件[0x00000000..0x00000000]

“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任务线程#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任务线程#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可运行

“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任务线程#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可运行

“VM定期任务线程”Prio=3 TID=0x000B1820 NID=0x23等待条件

共有1个答案

席言
2023-03-14

看来你用JSCH打开的ssh seesion没有终止;非后台进程线程connect thread仍处于活动状态。如果正如您所说的,您的程序正常运行,请确保断开与jsch会话的连接。

还可以将会话上的daemonthread属性设置为true,以避免ConnectThreadsession.Setdaemonthread(true)导致的挂起。必须在connect()之前调用。

 类似资料:
  • 问题内容: 为了在Linux上开发高度网络密集型服务器应用程序,首选哪种架构?这个想法是,该应用通常可以在具有多个内核(虚拟或物理)的机器上运行。考虑到性能是关键标准,选择多线程应用程序还是采用多进程设计更好?我确实知道资源共享和从多个进程访问此类资源的同步是很多编程开销,但是如前所述,整体性能是关键要求,因此我们可以忽略这些事情。编程语言为C / C ++。 我听说,即使是多线程应用程序(单个进

  • 问题内容: 在多线程应用程序中如何使用Hibernate(例如,每个客户端连接在服务器上启动它自己的线程)。 EntityManager应该仅由EntityManagerFactory创建一次,例如: 还是我必须为每个线程以及关闭EM的每个事务重新创建实体? 我的CRUD方法如下所示: 我要不要每次都跑?还是因为每个人都使用自己的缓存创建自己的EntityManager实例而使我陷入麻烦了? 问题

  • 我目前在Java的编程课上学习多线程。根据我的理解,不同线程的执行顺序是无法预测的,因此确保我们实现机制以确保所有东西都按所需的顺序执行是很重要的。 我学到的机制之一是使用,它强制一个线程等待,直到其他线程完成执行。然而,下面的示例代码实际上让我更加困惑: 这段代码应该演示是如何工作的,它将执行,然后得到一个正确打印的。 然而,当我实际运行代码时,执行的顺序似乎仍然是随机的。我得到的结果是 那么,

  • 在我的应用程序中,在程序的整个生命周期中,有n个操作必须依次发生。我决定为每个操作创建一个线程,让它们执行一次run方法,然后等待所有其他线程都执行相同的操作,等待轮到它,然后再次执行,依此类推,而不是创建实现这些操作的方法并在while(true)循环中按顺序调用它们。。。 为了实现这个机制,我创建了一个名为StatusHolder的类,它有一个名为threadTurn的字段(表示应该执行哪个线

  • 问题内容: 我正在尝试在我正在处理的Python项目中使用线程,但是线程似乎没有按照我的代码的预期运行。似乎所有线程都按顺序运行(即,线程2在线程1结束后开始,它们不是同时启动)。我编写了一个简单的脚本来对此进行测试,并且该脚本也按顺序运行线程。 这是我从运行它得到的输出: 循环的迭代次数更多时,观察到相同的行为。 我尝试搜索网络和较早的SO答案,但找不到任何有帮助的方法。有人可以指出这段代码有什

  • 我们有1000多条数据,请求1000次第三方个接口, 效率很是低下! 所以我想利用多线程的方式快速的调用完这1000次接口请求并处理响应 但是有个问题,线程是在for循环中执行的,调用顺序肯定是错乱的,这就导致接调用后 返回的结果肯定和List中的不匹配了··· 这种情况怎么能保证顺序呢?这是我的代码