Java 所有线程完成后打印数据

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

我只想在我创建的两个线程都是finishrun方法之后打印一个数组。
我该怎么做呢?

您可以将这些作业提交给执行者,每个作业都将返回一个
未来的
对象。对每个未来调用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(数组);