Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

 

(1) newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下:


Java 创建线程池 推荐 java如何创建线程池_线程池


1. package
2. import
3. import
4. public class
5. public static void
6.   ExecutorService cachedThreadPool = Executors.newCachedThreadPool();  
7. for (int i = 0; i < 10; i++) {  
8. final int
9. try
10. 1000);  
11. catch
12.     e.printStackTrace();  
13.    }  
14. new
15. public void
16.      System.out.println(index);  
17.     }  
18.    });  
19.   }  
20.  }  
21. }

 

线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
 
(2) newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:


Java 创建线程池 推荐 java如何创建线程池_线程池


1. package
2. import
3. import
4. public class
5. public static void
6. 3);  
7. for (int i = 0; i < 10; i++) {  
8. final int
9. new
10. public void
11. try
12.       System.out.println(index);  
13. 2000);  
14. catch
15.       e.printStackTrace();  
16.      }  
17.     }  
18.    });  
19.   }  
20.  }  
21. }

 
因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。
定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()

 

(3)  newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:


Java 创建线程池 推荐 java如何创建线程池_线程池


1. package
2. import
3. import
4. import
5. public class
6. public static void
7. 5);  
8. new
9. public void
10. "delay 3 seconds");  
11.    }  
12. 3, TimeUnit.SECONDS);  
13.  }  
14. }


 
表示延迟3秒执行。

定期执行示例代码如下:


Java 创建线程池 推荐 java如何创建线程池_线程池



    1. package
    2. import
    3. import
    4. import
    5. public class
    6. public static void
    7. 5);  
    8. new
    9. public void
    10. "delay 1 seconds, and excute every 3 seconds");  
    11.    }  
    12. 1, 3, TimeUnit.SECONDS);  
    13.  }  
    14. }


     
    表示延迟1秒后每3秒执行一次。

     

    (4) newSingleThreadExecutor
    创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:


    Java 创建线程池 推荐 java如何创建线程池_线程池


    1. package
    2. import
    3. import
    4. public class
    5. public static void
    6.   ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();  
    7. for (int i = 0; i < 10; i++) {  
    8. final int
    9. new
    10. public void
    11. try
    12.       System.out.println(index);  
    13. 2000);  
    14. catch
    15.       e.printStackTrace();  
    16.      }  
    17.     }  
    18.    });  
    19.   }  
    20.  }  
    21. }

     
    结果依次输出,相当于顺序执行各个任务。

    你可以使用JDK自带的监控工具来监控我们创建的线程数量,运行一个不终止的线程,创建指定量的线程,来观察:
    工具目录:C:\Program Files\Java\jdk1.6.0_06\bin\jconsole.exe
    运行程序做稍微修改:


    Java 创建线程池 推荐 java如何创建线程池_线程池


    1. package
    2. import
    3. import
    4. public class
    5. public static void
    6.   ExecutorService singleThreadExecutor = Executors.newCachedThreadPool();  
    7. for (int i = 0; i < 100; i++) {  
    8. final int
    9. new
    10. public void
    11. try
    12. while(true) {  
    13.        System.out.println(index);  
    14. 10 * 1000);  
    15.       }  
    16. catch
    17.       e.printStackTrace();  
    18.      }  
    19.     }  
    20.    });  
    21. try
    22. 500);  
    23. catch
    24.     e.printStackTrace();  
    25.    }  
    26.   }  
    27.  }  
    28. }

     
    效果如下:

     

    选择我们运行的程序:

    监控运行状态