java concurrent Executors

newCachedThreadPool 创建一个线程池

创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。

 1 public class LiftOff implements Runnable {
2 protected int countDown = 10; // Default
3 private static int taskCount = 0;
4 private final int id = taskCount++;
5
6 public LiftOff() {
7 }
8
9 public LiftOff(int countDown) {
10 this.countDown = countDown;
11 }
12
13 public String status() {
14 return "#" + id + "(" + (countDown > 0 ? countDown : "Liftoff!")
15 + ") " + "Thread id: " + Thread.currentThread().getName();
16     }
17
18 public void run() {
19 while (countDown-- > 0) {
20 System.out.println(status());
21 Thread.yield();
22 }
23 }
24 }
 1 public static void main(String[] args) {
2 /*ExecutorService sexec = Executors.newSingleThreadExecutor();*/
3 ExecutorService exec = Executors.newCachedThreadPool();
4
5 /*for(int i = 0 ; i< 5; i++){
6 sexec.execute(new LiftOff());
7 }*/
8
9 for(int i = 0 ; i< 5; i++){
10 exec.execute(new LiftOff());
11 }
12
13 exec.shutdown();
14 /*sexec.shutdown();*/
15 }

使用cachedThreadPool会不断地创建新的线程。

而使用newFixedThreadPool 会创建固定数量的线程,如果设置了数目3,那么即使循环5次,使用的线程其实也就是3个。

使用SingleThreadExecutor 则会至始至终创建一个线程,无论你在循环中创建几次,实际使用的线程只有一个。最后的打印结果就是一个线程反复的运行5次。

 



 

posted @ 2012-03-22 16:26  lostyue  阅读(337)  评论(0编辑  收藏  举报