我只想在我创建的 2 个线程是完成运行方法之后打印一个数组。我该怎么做?
6 回答
看看方法Thread#join()
。例如:
Thread a = ...;
a.start();
a.join(); // wait until Thread a finishes
简单的。使用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");
}
}
你试过什么吗?
让代码等待线程完成的标准方法是在该线程上调用 join() 方法;当它返回时,线程就完成了。试着查一下,看看你能弄清楚什么。
您可以将这些作业提交给 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
s 一起工作,提供一个Future
可以直接获取并发计算结果的函数。
任何一种方法都行得通,哪种方法更适合您将取决于您的用例。
我的意见是你应该使用CountDownLatch。
在打印之前,您应该显示以下内容:
CountDownLatch startSignal = new CountDownLatch(2);
// Create your threads and add startSignal as parameters to them
在每个线程结束时,您应该调用:
startSignal.countDown();
之后,在打印之前,您应该调用:
startSignal.await();
// print...
这将在计数器达到零后继续。
看看这篇文章(如何等待一组线程完成?,如何等待多个线程完成?)。