1、通过thread.join()方式,注意:如果有多个子线程,需要将全部的线程先start,然后再join。代码示例如下:
public class Main
{
public static void main(String[] args)
{
long start = System.currentTimeMillis();
List list = new ArrayList();
for(int i = 0; i < 5; i++)
{
Thread thread = new TestThread();
thread.start();
list.add(thread);
}
try
{
for(Thread thread : list)
{
thread.join();
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("子线程执行时长:" + (end - start));
}
}
2、主线程等待多个子线程(CountDownLatch实现)
CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
主要方法
public CountDownLatch(int count);
public void countDown();
public void await() throws InterruptedException
构造方法参数指定了计数的次数
countDown方法,当前线程调用此方法,则计数减一
await方法,调用此方法会一直阻塞当前线程,直到计时器的值为0
示例代码如下:
public classCountDownLatchDemo {final static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public static void main(String[] args) throwsInterruptedException {
CountDownLatch latch=new CountDownLatch(2);//两个工人的协作
Worker worker1=new Worker("zhang san", 5000, latch);
Worker worker2=new Worker("li si", 8000, latch);
worker1.start();//worker2.start();//latch.await();//等待所有工人完成工作
System.out.println("all work done at "+sdf.format(newDate()));
}static class Worker extendsThread{
String workerName;intworkTime;
CountDownLatch latch;public Worker(String workerName ,intworkTime ,CountDownLatch latch){this.workerName=workerName;this.workTime=workTime;this.latch=latch;
}public voidrun(){
System.out.println("Worker "+workerName+" do work begin at "+sdf.format(newDate()));
doWork();//工作了
System.out.println("Worker "+workerName+" do work complete at "+sdf.format(newDate()));
latch.countDown();//工人完成工作,计数器减一
}private voiddoWork(){try{
Thread.sleep(workTime);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}