天天看點

Java 線程的建立方式四--使用線程池

1.線程池的使用背景:

經常建立和銷毀線程,及使用量特别大的資源,比如并發情況下的線程,對計算機性能影響特别大,這時就需要一個能存儲這些經常使用的線程的東西,線程池因用而生

2.線程池的實作思路:

  • 提前建立好多個線程,放入線程池中,使用時直接擷取,使用後放回池中
  • 可以避免頻繁建立和銷毀線程,實作重複利用(類似生活中的公共交通工具,使用時借用一下,使用後放回規定地方,無需自己建立一個)

3.使用線程池的好處:

  • 提高響應速度(減少了建立新線程的時間)
  • 降低資源消耗(重複利用線程池中的線程)
  • 便于線程管理:
    • corePoolSize: 核心池的大小
    • maximumPoolSize: 最大線程數
    • keepAliveTime: 線程沒有任務時最多保持多長時間後會終止

4.線程池相關API

  • JDK5.0起:

ExecutorService 和 Executors

①ExecutorService:

真正的線程池接口

常見子類 ThreadPoolExecutor

  • void execute(Runnable command):

執行任務/指令,無傳回值,一般用來執行Runnable

  • <T>Future<T>submit(callable<T>task):

執行任務,有傳回值,一般用來執行Callable

  • void shutdown();

關閉連接配接池

②Executors:

工具類,線程池的工廠類,用來建立并傳回不同類型的線程池

  • Executors,newCachedThreadPool();

//建立一個可根據需要建立新線程的線程池

  • Executors,newFixedThreadPool():

//建立一個可重用固定線程數的線程池

  • Executors.newSingleThreadExecutor();

//建立一個隻有一個線程的線程池

  • Executors.newScheduledThreadPool():

//建立一個線程池,它可安排在給定延遲後運作指令或定期執行

eg:

package 線程池;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class NumberThread implements Runnable{

    @Override
    public void run() {
        for (int i=0;i<=100;i++){
            if (i%2==0){
                System.out.println(i);
            }
        }
    }
}
class NumberThread1 implements Runnable{

    @Override
    public void run() {
        for (int i=0;i<=100;i++){
            if (i%2!=0){
                System.out.println(i);
            }
        }
    }
}

public class Xiancehngchi {

    public static void main(String[] args) {

        //ExecutorService接口實作類的對象
        //1.提供指定線程數量的線程池
        ExecutorService service = Executors.newFixedThreadPool(10);  //設定線程的數量為10
        //2.執行指定的線程的操作,需要提供實作Runnable接口或Collable接口實作類的對象
        service.execute(new NumberThread());  //執行,适合使用于Runnable
        service.execute(new NumberThread1());   //建立第二個線程
        //service.submit(Collable collable);   //送出,适合使用于Collable
        //3.關閉線程池
        service.shutdown();

    }
}