子线程由主线程或者其他方法创建<主线程创建的子线程的优先级等同于主线程>,线程并发执行,那么怎么让主线程在子线程全部执行完再执行呢?
方法1、在关闭接收新线程之后添加判断循环(判断线程池中任务是否全部被终止,是返回true,否返回false)
while(!executorService.isTerminated()){}
方法2、使用CountDownLatch
该部分可参考:http://www.importnew.com/21889.html
第一步
/*闭锁需要等待的线程数量*/
private static CountDownLatch count = new CountDownLatch(20);
第二步
在创建完子线程之后阻塞主线程count.await();
第三步
在子线程中添加count.countDown();
<每执行完一个线程,计数减一,计数减为零时唤醒主线程>
————————————————-使用以上方法的代码—————————————————-
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class test_24_4 {
/*定义变量*/
private static Sum sumx=new Sum();
/*闭锁需要等待的线程数量*/
private static CountDownLatch count = new CountDownLatch(20);
public static void main(String [] args)throws Exception{
/*创建100个线程*/
//ExecutorService executorService= Executors.newFixedThreadPool(100);
ExecutorService executorService= Executors.newCachedThreadPool();
for(int i=0;i<20;i++){
executorService.execute(new Sumadd());
}
executorService.shutdown();
/**
* 或者仅添加以下代码
* while(!executorService.isTerminated()){}
*/
count.await();
System.out.println("主线程打印消息:"+sumx.getSum());
}
/*继承接口*/
private static class Sumadd implements Runnable{
public void run() {
synchronized (sumx){
sumx.add(1);
System.out.println("子线程打印消息:"+sumx.sum);
/*每结束一个线程count中的数量就会减1*/
count.countDown();
}
}
}
/*实体类*/
private static class Sum{
private int sum=0;
public int getSum(){
return sum;
}
public void add(int i){
int sum1=sum+i;
try {
Thread.sleep(5);
sum=sum1;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}