import java.util.concurrent.CountDownLatch; public class T { public static void main(String[] args) { int threadNum = 3; CountDownLatch threadSignal = new CountDownLatch(threadNum); for (int ii = 0; ii < threadNum; ii++) { Thread t = new ImportThread(threadSignal); t.start(); } try { threadSignal.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " end."); } } class ImportThread extends Thread { private CountDownLatch threadsSignal; public ImportThread(CountDownLatch threadsSignal) { this.threadsSignal = threadsSignal; } @Override public void run() { System.out.println(Thread.currentThread().getName() + " started..."); for (int i = 0; i < 8; i++) System.out.println(Thread.currentThread().getName() + " print " + i); System.out.println(Thread.currentThread().getName() + " end. " + threadsSignal.getCount() + " threads left."); threadsSignal.countDown(); } } Thread-0 started... Thread-0 print 0 Thread-0 print 1 Thread-0 print 2 Thread-0 print 3 Thread-0 print 4 Thread-0 print 5 Thread-0 print 6 Thread-1 started... Thread-0 print 7 Thread-1 print 0 Thread-0 end. 3 threads left. Thread-1 print 1 Thread-1 print 2 Thread-2 started... Thread-2 print 0 Thread-2 print 1 Thread-2 print 2 Thread-2 print 3 Thread-2 print 4 Thread-2 print 5 Thread-2 print 6 Thread-2 print 7 Thread-2 end. 2 threads left. Thread-1 print 3 Thread-1 print 4 Thread-1 print 5 Thread-1 print 6 Thread-1 print 7 Thread-1 end. 1 threads left. main end.