A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 涂金哲 中级黑马   /  2012-6-15 14:57  /  1199 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExepExec {
public static void main(String[] args){  
CountDownLatch cd1=new CountDownLatch(5);  //定义用需要五次事件才打开的锁存器  
CountDownLatch cd2=new CountDownLatch(5);  
CountDownLatch cd3=new CountDownLatch(5);  
CountDownLatch cd4=new CountDownLatch(5);
 ExecutorService es=Executors.newFixedThreadPool(2);//创建一个个可重用固定长度为2线程集合的线程池  
System.out.println("开启");  
es.execute(new MyThread(cd1,"A")) ;    //execute初始化执行器
 es.execute(new MyThread(cd2,"B")) ;  
es.execute(new MyThread(cd3,"C")) ;
 es.execute(new MyThread(cd4,"D")) ;
try {
cd1.await();    //等待锁寄存器倒计时值为零  cd2.await();
 cd3.await();  
cd4.await();
}catch(InterruptedException exc){  System.out.println(exc);
}
es.shutdown(); //当所有任务完成时关闭ExecutorService
System.out.println("关闭");
}
}
class MyThread implements Runnable{   //创建MyThread类实现Runnable接口
 String name;  
CountDownLatch latch;       MyThread(CountDownLatch c,String n){
 //构造方法初始化MyThread对象并且构造方法中创建Thread类线程对象  
 latch =c;      
    name=n;        
  new Thread(this);     //??此处this调用的是我们创建的MyThread类对象的引用吗??
 }  
public void run(){      //重写Run方法   for(int i=0;i<5;i++)
{   
System.out.println(name+":"+i);
  latch.countDown();     //递减锁存器的计数值为零,释放所有等待的线程
 } 
}
}
看到了一个关于执行器的程序。以下是我个人查看api,翻阅资料的理解。至今程序执行的流程还是不明白。 创建一个可重用固定长度的线程池newFixedThreadPool,通过CountDownLatch定义锁存器打开的条件。在MyThread类中将锁存器作为参数,可用来限定唤醒线程的条件。使用execute初始化四个线程,CountDownLatch提供了await方法使线程停下来,等待锁存器的打开事件完成。在MyThread类的run方法中通过循环实现了实例参数latch对countdown的调用,结果是把锁存器打开,线程被唤醒。两个线程完成四个执行器任务,整个过程。对多线程了解的不多,想提出一个问题:如果执行器任务很多,会不会出现这样一种情况,某个任务顺利完成,而后面还有执行器的任务没有提交到ExecutorService列表中。这是完成任务的执行器会调用shutDown()关闭ExecutorService,这样ExecutorService就完成已提交的任务然后关闭,导致没提交的无法完成吗?谢谢

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马