线程管理 - 竞争线程

时间:2017-02-26 19:08:32

标签: java

我的情况是我的多线程应用程序相互竞争。我有一个初始启动方法:

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

启动过程中的事件序列如下:

  1. 启动服务器以侦听连接
  2. 启动客户端以连接到服务器
  3. 向服务器发送消息
  4. 现在,第二步创建了一个ServerConnection,但是在调用第三步时,Se​​rverConnection实例尚未创建,并且为null。

    这一切都是因为我意识到我的对象流遇到了一些我试图修复的问题。最后,我意识到我需要确保写入和读取对象方法是同步的,这一问题在我改变之后就会出现这个问题。

    ServerClientThread延伸。 Server通过ClientConnection启动服务器套接字,并使用while true循环来监听和接受连接。 Client启动ServerConnection,这也是一个帖子。 teThreadPoolExecutor

    如何确保在继续之前等待之前的线程?

    如果你想看全班,请告诉我,我会发布所要求的课程。

1 个答案:

答案 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);应该做什么。好吧,不解释;但是在这里提供代码。