java线程调用主线程吗_java多线程执行时主线程的等待

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();

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值