Java 所有线程完成后打印数据
我只想在我创建的两个线程都是finishrun方法之后打印一个数组。Java 所有线程完成后打印数据,java,multithreading,Java,Multithreading,我只想在我创建的两个线程都是finishrun方法之后打印一个数组。 我该怎么做呢?您可以将这些作业提交给执行者,每个作业都将返回一个未来的对象。对每个未来调用get()方法,直到所有未来都完成为止: String[] myArr = new String[0]; ExecutorService service = Executors.newSingleThreadExecutor(); //Just one task, but repeat with as many as needed. F
我该怎么做呢?您可以将这些作业提交给执行者,每个作业都将返回一个
未来的
对象。对每个未来调用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()
是一种更标准的等待特定线程完成的方法,但就我个人而言,在当今这个时代,我更喜欢这种方法——如果需要的话,可以更容易地说以后将单线程执行器换成并发线程池(或类似的线程池),我个人也觉得它更整洁。它还可以很容易地重构以使用可调用的
s,提供一个未来的
,它可以直接获得并发计算的结果
这两种方法都可以,对您更有利的方法取决于您的用例。您尝试过什么吗 让代码等待线程完成的标准方法是在该线程上调用join()方法;当它返回时,线程就完成了。试着查一下,看看你能找出什么。看看这个方法。例如:
Thread a = ...;
a.start();
a.join(); // wait until Thread a finishes
看看这篇文章(如何等待一组线程完成?,)。简单。使用。在生成线程时,将它们添加到列表中,并在该列表中循环,然后调用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");
}
}
import java.lang.*;
公共类ThreadDemo实现可运行{
公开募捐{
//这里有一些实现
}
公共静态void main(字符串args[])引发异常{
List threadList=new ArrayList();
线程t1=新线程(new ThreadDemo());
t1.start();
添加(t1);
线程t2=新线程(new ThreadDemo());
t2.start();
添加(t2);
对于(线程t:线程列表){
//等待此线程死亡
t、 join();
}
System.out.print(“现在所有线程都已完成”);
}
}
我的意见是你应该使用
打印前,应显示以下内容:
CountDownLatch startSignal = new CountDownLatch(2);
// Create your threads and add startSignal as parameters to them
在每个线程的末尾,您应该调用:
startSignal.countDown();
之后,在打印之前,您应该调用:
startSignal.await();
// print...
计数器达到零后,这种情况将继续。好吧,贝瑞的答案更现代。我所有的线程工作都是在这些新型课程之前完成的。我的可能仍然有效,他的是最新的。我只想在c1和c2完成运行方法后打印变量数组。c1.开始();c2.开始();System.out.println(数组);