我想在我创建的2个线程完成运行方法之后才打印数组。 我怎么能这样做?
答案 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...
这将在计数器达到零后继续。