1. 程式人生 > >Java併發程式設計---Executors多工執行緒框架

Java併發程式設計---Executors多工執行緒框架

 一.概念

       為了更好地控制多執行緒,JDK提供了一套執行緒框架Executor,幫助開發人員有效地進行執行緒控制.他們都在java.util.concurrent包中,是JDK併發包的核心.其中有一個比較重要的類Executors,他扮演這執行緒工廠的角色,我們通過Executors可以建立特定功能的執行緒池.

          Executors建立執行緒池的方法:

       newFixedThreadPool()方法,該方法返回一個固定數量的執行緒池,該方法的執行緒數始終不變,當有一個任務提交時,若執行緒池中空閒,則立即執行;若沒有,則會被暫緩在一個任務佇列中等待有空閒的執行緒去執行.

       newSingleThreadExecutor()方法,建立一個執行緒的執行緒池,若空閒則執行,若沒有空閒執行緒則暫緩在任務佇列中

       newCachedThreadPool()方法,返回一個可根據實際情況調整執行緒數量的執行緒池,不限制最大執行緒數量,若有任務,則建立執行緒;若無任務,則不建立執行緒.若果沒有任務,則執行緒在60s後自動回收(空閒時間60s)

       newScheduledThreadPool()方法,該方法返回一個ScheduledExecutorService物件,但該執行緒池可以指定執行緒的數量

二.使用示例

package com.thread.executors;

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

/**
 * 多工執行緒框架
 * @author lhy
 * @time 2017.01.05
 *
 */
public class UseExecutors {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		ExecutorService pool = Executors.newFixedThreadPool(10);         //定義固定的執行緒池數量
		
		ExecutorService pool2 = Executors.newSingleThreadExecutor();
		
		ExecutorService pool3 = Executors.newCachedThreadPool();
		
		ExecutorService pool4 = Executors.newScheduledThreadPool(10);
	}

}

 2.1 newFixedThreadPool()方法JDK底層實現

    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

 2.2 newSingleThreadExecutor()方法JDK底層實現
    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

 2.3 newCachedThreadPool() 方法JDK底層實現
    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

 2.4 newScheduledThreadPool() 方法JDK底層實現
    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }