3

我只想在我创建的 2 个线程是完成运行方法之后打印一个数组。我该怎么做?

4

6 回答 6

6

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

Thread a = ...;
a.start();
a.join(); // wait until Thread a finishes
于 2013-03-11T20:11:56.360 回答
6

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

像这样的东西:

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");
   }
}
于 2013-03-11T20:15:40.220 回答
1

你试过什么吗?

让代码等待线程完成的标准方法是在该线程上调用 join() 方法;当它返回时,线程就完成了。试着查一下,看看你能弄清楚什么。

于 2013-03-11T20:11:14.863 回答
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()是等待特定线程完成的更标准的方法,但就个人而言,在这个时代我更喜欢这种方法 - 以后应该更容易说将单线程执行器换成并发线程池(或类似的)需求出现了,我个人也觉得它更整洁。它也可以很容易地重构为与Callables 一起工作,提供一个Future可以直接获取并发计算结果的函数。

任何一种方法都行得通,哪种方法更适合您将取决于您的用例。

于 2013-03-11T20:10:51.510 回答
0

我的意见是你应该使用CountDownLatch

在打印之前,您应该显示以下内容:

CountDownLatch startSignal = new CountDownLatch(2);

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

在每个线程结束时,您应该调用:

startSignal.countDown();

之后,在打印之前,您应该调用:

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

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

于 2013-03-11T20:17:32.563 回答
0

看看这篇文章(如何等待一组线程完成?如何等待多个线程完成?)。

于 2013-03-11T20:15:24.853 回答