我的情况是我的多线程应用程序相互竞争。我有一个初始启动方法:
public void standAloneStartup(){
try {
this.startupComms();
} catch (InterruptedException ex) {
Logger.getLogger(ThinClientEngine.class.getName()).log(Level.SEVERE, null, ex);
}
this.startupProcess();
this.requestAllProjects();
}
以下是startupComms
方法:
final synchronized void startupComms() throws InterruptedException{
//Listen for connections
this.tceServer = new Server(6300, this, "ThinClientEngineServer");
te.execute(tceServer);
this.tceServer.join();
Info.Info(this.tceServer.getServerName() + " is running and can recieve connections...");
//Connect to Application Server
this.appClient = new Client("localhost", 6000, this, "AppEngineClientConnection");
te.execute(appClient);
this.appClient.join();
Info.Info(this.appClient.getClientName() + " successfully connected...");
}
正如您所看到的,我尝试制作方法synchronized
,我也尝试join
线程,以便当前不会处理。从我读到的内容,join方法将一直等到线程完成或调用notify
。
启动过程中的事件序列如下:
现在,第二步创建了一个ServerConnection,但是在调用第三步时,ServerConnection实例尚未创建,并且为null。
这一切都是因为我意识到我的对象流遇到了一些我试图修复的问题。最后,我意识到我需要确保写入和读取对象方法是同步的,这一问题在我改变之后就会出现这个问题。
Server
和Client
从Thread
延伸。 Server
通过ClientConnection
启动服务器套接字,并使用while true循环来监听和接受连接。 Client
启动ServerConnection
,这也是一个帖子。 te
是ThreadPoolExecutor
。
如何确保在继续之前等待之前的线程?
如果你想看全班,请告诉我,我会发布所要求的课程。
答案 0 :(得分:1)
来自join()
的javadoc等待此线程死亡。
所以:
this.tceServer.join();
Info.Info(this.tceServer.getServerName() + " is running and can recieve connections...");
听起来像是一个很大的矛盾。等待服务器线程 die ;然后你希望它可用!
这解释了为什么你的代码没有按照你的期望去做;你的假设A)join()正在做什么和B)你的Thread子类的 run()方法如何表现都不准确。
为真正帮助解决潜在问题;你必须向我们展示该服务器类的代码;你必须解释究竟te.execute(tceServer);
应该做什么。好吧,不解释;但是在这里提供代码。