完成所有线程后打印数据

时间:2013-03-11 20:09:27

标签: java multithreading

我想在我创建的2个线程完成运行方法之后才打印数组。 我怎么能这样做?

6 个答案:

答案 0 :(得分:6)

看一下方法Thread#join()。例如:

Thread a = ...;
a.start();
a.join(); // wait until Thread a finishes

答案 1 :(得分:4)

简单。使用Thread.join()。当您生成线程时,将它们添加到列表中并循环遍历该列表并调用thread.join()。一旦你离开那个循环,你的所有线程都会被确认完成。然后你可以在那之后得到print语句。

这样的事情:

import java.lang.*;

public class ThreadDemo implements Runnable {

   public void run() {

      //some implementation here
   }

   public static void main(String args[]) throws Exception {

      List<Thread> threadList = new ArrayList<Thread>();
      Thread t1 = new Thread(new ThreadDemo());
      t1.start();
      threadList.add(t1);
      Thread t2 = new Thread(new ThreadDemo());
      t2.start();
      threadList.add(t2);
      for(Thread t : threadList) {
          // waits for this thread to die
          t.join();
      }
      System.out.print("All the threads are completed by now");
   }
}

答案 2 :(得分:1)

你有没有尝试过什么?

让代码等待线程完成的标准方法是在该线程上调用join()方法;当返回时,线程完成。尝试查看并了解您可以找到的内容。

答案 3 :(得分:0)

您可以将这些作业提交给Executor,每个作业都会返回一个Future对象。在每个期货上调用get()方法,你将阻止它们直到所有这些方法完成:

String[] myArr = new String[0];
ExecutorService service = Executors.newSingleThreadExecutor();

//Just one task, but repeat with as many as needed.
Future f = service.submit(new Runnable() {
    public void run() {
        //Executing code
    }
});
f.get();

System.out.println(Arrays.toString(myArr));  //Print array.

Thread.join()是等待特定线程完成的更标准的方式,但是在这个时代,我更喜欢这种方法 - 它使得更换单个线程执行器以实现并发更容易线程池(或类似的)稍后应该出现,并且我个人觉得它也更整洁。它也可以很容易地重构以使用Callable,提供Future,可以直接获得并发计算的结果。

任何一种方法都可行,对你来说更好的方法取决于你的用例。

答案 4 :(得分:0)

看一下这篇文章(如何等待一组线程完成?How to wait for a number of threads to complete?)。

答案 5 :(得分:0)

我的意见是你应该使用CountDownLatch

在打印之前,您应该显示:

CountDownLatch startSignal = new CountDownLatch(2);

// Create your threads and add startSignal as parameters to them

在每个帖子结束时,你都会打电话:

startSignal.countDown();

在打印之前,您应该致电:

startSignal.await();
// print...

这将在计数器达到零后继续。