1. 程式人生 > >多執行緒--05(執行緒池的建立)

多執行緒--05(執行緒池的建立)

執行緒池: 什麼是執行緒池: Java中的執行緒池是應用場景最多的併發框架,幾乎所有需要非同步或併發執行任務的程式,都可以使用執行緒池,在併發的過程中合理的使用執行緒池能夠帶來3個好處。 降低資源的消耗:通過重複利用已建立執行緒,降低執行緒的建立和執行緒銷燬的所造成資源的消耗; 提高響應速度:當任務達到時,任務可以不需要等待執行緒的建立就可以立即執行。 提高執行緒的可管理性:執行緒時稀缺資源,如果無限制的建立,不僅會消耗資源,還會降低系統的穩定性,使用執行緒池可以進行統一分配,調優和監控。但是要做到合理利用。 使用執行緒池的原因: 經常建立,啟動,銷燬一個執行緒都非常耗時間。使用執行緒池進行管理複用執行緒,提高程式的效率。 java中使用執行緒池核心是ThreadPoolExecutor.方法。 使用執行緒池的方式: Executor封裝了四種執行緒池型別; 1.new CachedThreadPool 建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活的回收空閒執行緒,若無可回收,則建立執行緒。 2.new FixedThreadPool建立一個定長的執行緒池,可控制執行緒最大的併發量,超出的執行緒會在佇列中等待。 3.new ScheduledThreadPool建立一個定長執行緒池,支援定時和週期行執行任務。 4.newSingleThreadExecutor建立一個單執行緒池化的執行緒池,他只會使用唯一工作的執行緒來執行任務,保證所有的執行緒按照順序執行(FIFO,LIFO)執行。 執行緒池的合理配置: cpu密集和I/o密集。

package com.itmayiedu.day04;

import java.util.concurrent.*;

/**
 *
 * 執行緒池的建立方法
 */
public class ThreadPoolExecutroDemo01 {
     public static void main(String[] args) {
          test01();
         // test02();
        //  test03();
        //  test04();
     }

     //1。建立可快取的執行緒池 可重複利用
     public static void
test01(){ ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { int temp = i + 1; executorService.execute(new Runnable() { @Override public void run() { System.out.println("ThreadName:"
+ Thread.currentThread().getName() + " i: " + temp); } }); } executorService.shutdown();//執行緒池的停止 會等待所有的執行緒執行完畢才會停止執行緒。 } //2.建立可定長度的執行緒池 public static void test02(){ ExecutorService executorService = Executors.newFixedThreadPool(3);//建立3個執行緒池 for (int i = 0; i <10 ; i++) { int temp =i; executorService.execute(new Runnable() { @Override public void run() { System.out.println("ThreadName:"+Thread.currentThread().getName()+" i: "+temp); } }); } executorService.shutdown();//執行緒的停止,會等待所有的執行緒執行完畢才會停止。 } //3.建立可定時的執行緒池,指定長度的執行緒池 public static void test03(){ ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3); for (int i = 0; i <10 ; i++) { int temp =i; scheduledExecutorService.schedule(new Runnable() { @Override public void run() { System.out.println("ThreadName: "+Thread.currentThread().getName()+" i:"+temp); } },3, TimeUnit.SECONDS); } scheduledExecutorService.shutdown();//執行緒的停止,會等待所有的線=執行緒執行完畢後才會停止 } //建立單執行緒執行緒池 public static void test04(){ ExecutorService executorService = Executors.newSingleThreadExecutor(); for (int i = 0; i <10 ; i++) { int temp =i; executorService.execute(new Runnable() { @Override public void run() { System.out.println("ThreadName:"+Thread.currentThread().getName()+" i:"+temp); } }); } executorService.shutdown();//執行緒的停止,會等待所有的執行緒執行完畢之後才會停止 } }