一、几个类介绍
1.Executor是一个接口,有public void execute(Runnable command)方法
2.Executors是一个工厂类,用于返回相应的Executor实例
3.ExecutorService是Executor的实现类
4.CountDownLatch是一个阻塞计数器,当大于0时阻塞
二、以下类实现了一个简单的程序 :主线程创建了许多的ThreadWorker,并让其在不同的线程中执行,然后主线程阻塞,直到所有的ThreadWorker运行完
1.ThreadWorker实现Runnable接口,属于工作类,子类必须实现doWork()方法;当做完工作时,调用CountDownLatch的countDown()方法,将计数减1
2.ThreadExecutor类可以添加ThreadWorker,在调用ExecutorService的execute(Runnable command)后,调用signal.await()使得调用线程阻塞,直到所有的ThreadWorker执行完毕(因为countDown()方法的调用使得计数会减为0)
3.注意:这两个类的CountDownLatch对象要为同一个
4.测试代码
输出:
[pool-1-thread-1]I'm started.
[pool-1-thread-2]I'm started.
[pool-1-thread-4]I'm started.
[pool-1-thread-3]I'm started.
[pool-1-thread-6]I'm started.
[pool-1-thread-5]I'm started.
[pool-1-thread-8]I'm started.
[pool-1-thread-10]I'm started.
[pool-1-thread-7]I'm started.
[pool-1-thread-9]I'm started.
[pool-1-thread-2]I'm finished, elapsed 5s.
[pool-1-thread-1]I'm finished, elapsed 5s.
[pool-1-thread-6]I'm finished, elapsed 5s.
[pool-1-thread-3]I'm finished, elapsed 5s.
[pool-1-thread-5]I'm finished, elapsed 5s.
[pool-1-thread-4]I'm finished, elapsed 5s.
[pool-1-thread-8]I'm finished, elapsed 5s.
[pool-1-thread-10]I'm finished, elapsed 5s.
[pool-1-thread-9]I'm finished, elapsed 5s.
[pool-1-thread-7]I'm finished, elapsed 5s.
==============================================
5.如果不调用ExecutorService的shutdown()方法,因为线程池还存在,因此程序不会退出