Java streams and main thread

What is the best way to make the main thread wait for all threads to complete?

  for (int i = 0; i <n; i ++) {
    Thread t = new Thread ();
    t.start ();

 }

 // wait for all threads to finish

+7
source share
5 answers

Create a list and wait for it.

List<Thread> threads = new ArrayList<Thread>(); for(int i=0;i<n;i++){ Thread t=new Thread(); t.start(); threads.add(t); } for(Thread t: threads) t.join(); 

However, using an ExecutorService might be a more elegant way to handle a thread pool.

 ExecutorService es = Executors.newCachedThreadPool(); for(int i=0;i<n;i++) es.submit(new Task(n)); es.shutdown(); es.awaitTermination(timeout, TimeUnit.SECONDS); 
+16
source
 List<Thread> threads = new ArrayList<Thread>(); for(int i=0;i<n;i++){ Thread t=new Thread(); threads.add(t); t.start(); } for(Thread t:threads){ t.join(); } 
+2
source

This can be done using thread.join( )

It has also been said here. Take a look.

Example:

 class MyThread implements Runnable { String name; // name of thread Thread t; MyThread(String threadname) { name = threadname; t = new Thread(this, name); System.out.println("New thread: " + t); t.start(); } public void run() { try { for (int i = 5; i > 0; i--) { System.out.println(name + ": " + i); Thread.sleep(1000); } } catch (InterruptedException e) { System.out.println(name + " interrupted."); } System.out.println(name + " exiting."); } } public class MainClass { public static void main(String args[]) { MyThread ob1 = new MyThread("One"); MyThread ob2 = new MyThread("Two"); MyThread ob3 = new MyThread("Three"); System.out.println("Thread One is alive: " + ob1.t.isAlive()); System.out.println("Thread Two is alive: " + ob2.t.isAlive()); System.out.println("Thread Three is alive: " + ob3.t.isAlive()); try { System.out.println("Waiting for threads to finish."); ob1.t.join(); ob2.t.join(); ob3.t.join(); } catch (InterruptedException e) { System.out.println("Main thread Interrupted"); } System.out.println("Thread One is alive: " + ob1.t.isAlive()); System.out.println("Thread Two is alive: " + ob2.t.isAlive()); System.out.println("Thread Three is alive: " + ob3.t.isAlive()); System.out.println("Main thread exiting."); } } 

Although the question is marked as "java", it can also be done in C # in the following ways:

+1
source

I think the best solution for your requirement is CyclicBarrier see http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CyclicBarrier.html

or

in this example

0
source

You can use CountDOwnLatch

 CountDownLatch lat = new CountDownLatch(noOfTasks); ExecutorService exec = Executors.newFixedThreadPool(4); while(...) { exec.execute(new MyTask()); } try { lat.await(); } catch (InterruptedException E) { // } 

and as part of your task (enclose in try / finally)

 lat.countDown(); 
0
source

All Articles