同步两个线程

Posted

技术标签:

【中文标题】同步两个线程【英文标题】:Synchronizing two threads 【发布时间】:2009-05-16 20:31:48 【问题描述】:

我有两个线程,我希望第二个线程等到第一个线程完成。我怎样才能做到这一点?

这是我的代码:

public class NewClass1 implements Runnable 

    // in main
    CallMatlab c = new CallMatlab();
    CUI m = new CUI();
    Thread t1 = new Thread(c);
    t1.start();
    Thread t2 = new Thread(m);
    try 
      t1.join();
     catch (InterruptedException ex)  
      Logger.getLogger(NewClass1.class.getName()).log(Level.SEVERE, null, ex);
    
    t2.start();

  //
  public void run() 
    throw new UnsupportedOperationException("Not su..");
  

【问题讨论】:

@MOUZA:您已将代码发布在评论中,这几乎是不可读的......请通过编辑问题将其包含在问题中。将其缩进四个空格,它将在问题中很好地格式化。 我添加了它,但它不是一个完整的工作代码示例(可能它被剥离以适应评论框)。 【参考方案1】:

使用Thread.join() 方法。从第二个线程调用

firstThread.join();

还有一些可选的重载也会超时。你需要处理InterruptedException,以防你的第二个线程在第一个线程完成之前被中断。

【讨论】:

【参考方案2】:

您需要致电:

first_thread.join();

来自第二个线程。

请参阅Thread.join documentation。

【讨论】:

【参考方案3】:

为了涵盖所有基础知识,您也可以使用信号量。

在服务员中

/* spawn thread */
/* Do interesting stuff */
sem.acquire();

在服务员中

/* wake up in the world */
/* do intersting stuff */
sem.release();

如果服务员只是要终止,这种方法绝不是优越的,但信号量很有趣,所以我认为值得一提。

【讨论】:

【参考方案4】:

除非您的第一个线程与第二个线程同时做一些有用的事情,否则您最好使用一个线程。如果他们都在做一些有用的事情,请按照建议使用 join()。

【讨论】:

这是我的代码 public class NewClass1 在 main CallMatlab c = new CallMatlab(); 中实现 Runnable 崔米 = 新崔();线程 t1 = 新线程(c); t1.start();线程 t2 = 新线程(m);试试 t1.join(); catch (InterruptedException ex) Logger.getLogger(NewClass1.class.getName()).log(Level.SEVERE, null, ex); t2.start(); public void run() throw new UnsupportedOperationException("Not su..");【参考方案5】:

您也可以考虑使用java.util.concurrent 包。 CountDownLatch 或 CyclicBarrier 可用于协调线程,而 Executors 非常适合管理并发任务。

【讨论】:

以上是关于同步两个线程的主要内容,如果未能解决你的问题,请参考以下文章

Java和同步两个线程

使用两个队列同步线程

如何在特定的代码行同步两个 CPU 线程?

Synchronized 同步方法的八种使用场景

在 C++ 中的两个线程之间同步变量的正确方法是啥?

同步Qt中两个方法的线程执行