Java線程池的使用
顧名思義,池子裏面有多個線程,但是會有不同的池子,那麼就簡單的介紹下池子的種類
線程池的種類
Executors.newCachedThreadPool()
創建一個可緩存線程的線程池,可靈活創建、回收線程。
Executors.newFixedThreadPool(int num)
創建一個定長線程的線程池,可以控制最大併發數。
Executors.newScheduledThreadPool(int num)
創建一個定長線程的線程池,支持自定義線程定時執行任務。
Execuotrs.newSingleThreadExecutor()
創建一個只有一個線程的線程池。
示例代碼
Executors.newCachedThreadPool()
可緩存線程的線程池,可靈活創建、回收線程
- public class ThreadPoolExecutorTest {
- public static void main(String[] args) {
- // 該線程池中的線程數量理論爲無限大
- ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
- for (int i = 0; i < 10; i++) {
- final int index = i;
- try {
- Thread.sleep(index * 1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- // 當執行第二個任務時,第一個任務已經執行完成,所以第二個任務會複用第一個線程。而不用創建新的線程
- cachedThreadPool.execute(new Runnable() {
- public void run() {
- System.out.println(index);
- }
- });
- }
- }
- }
Executors.newFixedThreadPool(int num)
定長線程的線程池,可以控制最大併發數,超出的線程會在隊列中等待
- public class ThreadPoolExecutorTest {
- public static void main(String[] args) {
- ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
- for (int i = 0; i < 10; i++) {
- final int index = i;
- fixedThreadPool.execute(new Runnable() {
- // 線程池中的線程數量爲3個,所以每兩秒打印三個數字
- public void run() {
- try {
- System.out.println(index);
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- });
- }
- }
- }
Executors.newScheduledThreadPool(int num)
創建一個定長線程的線程池,支持自定義線程延遲執行任務、週期執行任務
- public class ThreadPoolExecutorTest {
- public static void main(String[] args) {
- ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
- scheduledThreadPool.schedule(new Runnable() {
- public void run() {
- System.out.println("delay 3 seconds");
- }
- // 表示每個線程延遲三秒執行
- }, 3, TimeUnit.SECONDS);
- // 表示每個線程延遲一秒,每三秒執行一次
- //}, 1, 3, TimeUnit.SECONDS);
- }
- }
Execuotrs.newSingleThreadExecutor()
創建一個只有一個線程的線程池
- public class ThreadPoolExecutorTest {
- public static void main(String[] args) {
- ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
- for (int i = 0; i < 10; i++) {
- final int index = i;
- singleThreadExecutor.execute(new Runnable() {
- public void run() {
- try {
- System.out.println(index);
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- });
- }
- }
- }