匿名线程多线程问题

时间:2013-12-06 16:12:35

标签: java multithreading

我遇到了通过多个线程执行实例方法的顺序问题。

我有我的类和线程结构,如下所述。

对于MainObj的实例,方法lastExcec()应在thirdExec()之后执行。 方法thirdExec()由一个线程序列调用,该序列旋转3个级别的匿名线程。 mehtod lastExcec()由另一个稍后启动但具有一级匿名线程的线程调用。

//The class that initiates the process
ThreadExecuter
{
 ThreadExecuter()
 {
  MainObj anObj = new MainObj();
  .
  .
  .
  .
  anObj.lastExec();
 }
}

// The class that has the in which the mentioned methods present
MainObj
{

// first get executed from constructor through anon thread.
 MainObj()
 {
  new Thread()
  {
   run()
   {
    firstExec();
   }
  }
 }

// first executes second through anon thread
 firstExec()
 {
  new Thread()
  {
   run()
   {
    secExec();
   }
  }
 }

//sec executes third through an anonymous thread
 secExec()
 {
  new Thread()
  {
   run()
   {
    thirdExec();
   }
  }
 } 

 thirdExec()
 {
 }
// last should be executed after thrid
 lastExcec()
 {
 }
}

1 个答案:

答案 0 :(得分:1)

  

我遇到了通过多个线程执行实例方法的顺序问题。

编写多线程应用程序的重点是线程异步并行工作。如果您需要或想要特定的操作订单,那么您通常需要编写代码来确保它。

在您的情况下,我相信您在询问为什么在调用其他线程的方法之前主线程调用lastExcec()方法。这是因为主线程可能没有等待其他线程完成。它分叉子线程并继续与它们并行执行。 Thread.start()方法通常花费一些时间,因此在任何其他线程实际开始执行之前可以调用lastExec()

如果您需要等待特定线程,则需要使用thread.join()加入它。这对您的代码来说很困难,因为线程对象是匿名的,并且是在MainObj内创建的。

还有一条评论。在对象构造函数中分叉线程被认为是一种糟糕的模式。这是因为您很可能将this的引用泄露给其他可能在完全构造之前使用该对象的线程。最好在start()上添加一个MainObj方法,它实际上启动了在构造函数中创建的线程。