Here is another way of having the main thread wait for all child threads to complete, using java.util.concurrent.FutureTask and Callable.
package test.concurrent;  
import java.util.Vector;
import java.util.concurrent.*;

public class FutureTaskTest {
private Vector<String> threadNames = new Vector<String>();
public static void main(String[] args) {
FutureTaskTest test = new FutureTaskTest();
test.threadTest(Integer.parseInt(args[0]));
System.out.println(test.threadNames);
}

private void threadTest(int numOfThreads) {
Thread[] threads = new Thread[numOfThreads];
FutureTask<String>[] futureTasks = new FutureTask[numOfThreads];
for (int i = 0; i < threads.length; i++) {
futureTasks[i] = new FutureTask<String>(new MyCallable());
threads[i] = new Thread(futureTasks[i]);
threads[i].start();
}
for (FutureTask<String> f : futureTasks) {
try {
threadNames.add(f.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}

private static class MyCallable implements Callable<String> {
public String call() {
for (int i = 0; i < 1000000; i++) {
i = i + 0;
}
return Thread.currentThread().getName();
}
}
}
FutureTask is usually used along with ExecutorService, but it can also be passed to Thread constructor. The output is always in the order from thread-0 to thread-9, because when we iterate through futureTasks to get result, each get() call wait for a certain duration for the result to be published by child thread.
$ java test.concurrent.FutureTaskTest 10
[Thread-0, Thread-1, Thread-2, Thread-3, Thread-4, Thread-5, Thread-6, Thread-7, Thread-8, Thread-9]
The Vector field threadNames can also be replaced with ArrayList, since it is only accessed in the main thread and no synchronization is needed.
2

View comments

Labels
Archive
Popular Posts
Popular Posts
  • Two JVM options are often used to tune JVM heap size: -Xmx for maximum heap size, and -Xms for initial heap size. Here are some common mi...
  • Simple enum . The ; after the last element is optional, when this is the end of enum definition. public enum Color { WHITE, BLACK, RED, ...
  • How to set project classpath in Eclipse and NetBeans are similar: just right-click the project name, choose Properties to bring up the Prope...
  • Let's say I need to spawn multiple threads to do the work, and continue to the next step only after all of them complete. I will need t...
  • This is a sample web.xml based on Servlet 2.5 (part of Java EE 5) that declares common elements. All top-level elements are optional, and c...
  • The default string value for java enum is its face value, or the element name. However, you can customize the string value by overriding toS...
  • Prior to JDK 6, we can check if a string is empty in 2 ways: if(s != null && s.length() == 0) if(("").equals(s)) Checking ...
  • When writing javadocs, IntelliJ automatically adds a closing tag for html elements. For instance, after typing <lt>, it automaticaly a...
  • StringBuilder was introduced in JDK 1.5. What's the difference between StringBuilder and StringBuffer? According to javadoc , StringBu...
  • With array, we can easily declare and initialize it at the same time: String[] favorites = new String[] {"EJB", "JPA", ...
Loading