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就完成已提交的任务然后关闭,导致没提交的无法完成吗?谢谢 |