在java中同步线程

时间:2012-06-28 15:42:53

标签: java multithreading synchronization

我正在为多线程实现java Runnable接口。我有一些n个线程。每个线程都有自己的生命。我想等到所有线程的生命到期。让我们说以下是案例

for(int i = 0; i< k;i++){
 Thread thread1 = new Thread(new xyz())
 Thread thread2 = new Thread(new abc())
 Thread thread3 = new Thread(new mno())
 thread1.start();
 thread2.start();
 thread3.start();
}

我正在做以下同步。我不知道它是否正确。请让我知道我该怎么办?如果我的线程程序工作正常,有没有办法检查?

          if(thread2.isAlive())
                try {
                    thread2.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            if(thread1.isAlive())
                    try {
                        thread1.join();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
            if(thread3.isAlive())
                try {
                        thread3.join();
                } catch (InterruptedException e) {
                e.printStackTrace();
                    }   

5 个答案:

答案 0 :(得分:8)

您可以将您的Runnables添加到ExecutorService并致电shutdown / awaitTermination,这将在所有任务完成后返回。 javadoc中有一些例子 - 总结一下,你会写出类似的东西:

ExecutorService executor = Executors.newFixedThreadPool(3);

executor.submit(runnable1);
executor.submit(runnable2);
executor.submit(runnable3);

executor.shutdown();
boolean allRunnableAreDone = executor.awaitTermination(60, TimeUnit.SECONDS);

// This line is reached once all runnables have finished their job
// or the 60 second timeout has expired

答案 1 :(得分:4)

虽然来自@assylias的ExecutorService答案很好,但这里有关于join()的更多信息。

您不需要在isAlive()之前测试join()Thread.join()代码已经这样做了。这是代码中的代码片段:

while (isAlive()) {
    wait(0);
}

所以你需要做的就是加入你的主题:

   try {
       thread2.join();
       thread1.join();
       thread3.join();
   } catch (InterruptedException e) {
       // always a good pattern
       Thread.currentThread().interrupt();
       e.printStackTrace();
   }

答案 2 :(得分:2)

作为一个简单的解决方案,您可以将所有线程放在List中,然后在它们启动后调用它们的连接:

List<Thread> threads = new ArrayList<>();
for(int i = 0; i< k;i++)
{
  //create threads
  Thread thread1 = new Thread(new xyz());
  Thread thread2 = new Thread(new abc());
  Thread thread3 = new Thread(new mno());

  //store threads
  threads.add(thread1);
  threads.add(thread2);
  threads.add(thread3);

  //start threads
  thread1.start();
  thread2.start();
  thread3.start();
}

//join all threads
for(Thread t : threads)
   t.join();

//You are here after all threads have terminated

答案 3 :(得分:1)

Java包含在java.util.concurrent中执行此类操作的机制。

在您的情况下,您可能需要CountDownLatchExecutorService

答案 4 :(得分:1)

join()方法不会在线程上连接,而是在锁定对象上连接。等待线程必须调用lockObject.join(),工作线程完成后必须调用lockObject.notify()。等待线程将被通知并可以继续其工作。这些电话周围还需要synchronize个阻止。

我还推荐像提到的assylias这样的Executor,它比自己实现这个行为容易得多。