Java 程序在多线程处理中没有顺利结束
我正在我的程序中创建一些线程。在这里,我使用了连接方法,以便主线程将等待我的所有线程。但是,每当我运行这个程序时,它并没有完成所有信息消息的打印,但程序仍然没有顺利结束。有人能帮我解决这个问题吗 下面是我的代码:Java 程序在多线程处理中没有顺利结束,java,multithreading,Java,Multithreading,我正在我的程序中创建一些线程。在这里,我使用了连接方法,以便主线程将等待我的所有线程。但是,每当我运行这个程序时,它并没有完成所有信息消息的打印,但程序仍然没有顺利结束。有人能帮我解决这个问题吗 下面是我的代码: ArrayList<DeployerThread> threadsarrforjoin = new ArrayList<DeployerThread>(); for (int i = 0; i < serverList.size(); i++) {
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");
ArrayList threadsarrforjoin=new ArrayList();
对于(int i=0;i
以下是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");
}
}
公共部署线程(ServerConfig ServerConfig、String actn、String WEBPROC、String WEBPROC1、String WEBPROCIgnore){
debug(“内部部署线程构造函数”);
logger.debug(“serverConfig=“+serverConfig”);
logger.debug(“Action=“+actn”);
设置服务器配置(服务器配置);
setTaskaction(actn);
setWebproc(WEBPROC);
setWebproc1(WEBPROC1);
setWebprocignore(WEBPROCIgnore);
}
公共最终服务器配置getServerConfig(){
返回serverConfig;
}
公共最终无效设置服务器配置(服务器配置服务器配置){
this.serverConfig=serverConfig;
}
公开募捐{
debug(“内部线程运行方法:Start”);
计数++;
logger.debug(“线程号>>>>”+count+“使用JSCH打开的ssh会话似乎没有终止;一个非守护进程线程
连接线程
仍处于活动状态。如果正如您所说,您的程序正在正常运行,请确保断开与JSCH会话的连接
您还可以将会话上的
DaemonThread
属性设置为true,以避免由ConnectThread会话引起的挂起。必须在connect()
之前调用setDaemonThread(true)
。要更快地获得更好的帮助,请发布一条消息。这是什么意思“你到底期望什么?你的程序输出什么?到目前为止,我不知道问题出在哪里。“没有顺利结束”这意味着程序正在完全执行,但它似乎仍在等待某些东西。控制并没有返回。在这里,我想确保join在这种情况下能正常工作?因为我认为它会无限期地等待某些东西。您可以进行线程转储(ctrl+break或使用jstack)吗当程序处于该状态时,将其发布。还可以包含DeployerThread的代码。Hi gkamal…我已经用DeployerThread代码编辑了我的问题,还添加了线程转储。请检查。