ExecutorService 建立一個多線程的線程池的步驟


ExecutorService 建立一個多線程的線程池的步驟:

線程池的作用:

線程池功能是限制在系統中運行的線程數。

     依據系統的環境情況,能夠自己主動或手動設置線程數量。達到執行的最佳效果;少了浪費了系統資源,多了造成系統擁擠效率不高。用線程池控制線程數量,其它線程排隊等候。一個任務執行完成,再從隊列的中取最前面的任務開始執行。

若隊列中沒有等待進程。線程池的這一資源處於等待。

當一個新任務須要執行時,假設線程池中有等待的工作線程,就能夠開始執行了;否則進入等待隊列。

為什么要用線程池:

1.降低了創建和銷毀線程的次數,每一個工作線程都能夠被反復利用,可運行多個任務。

2.能夠依據系統的承受能力。調整線程池中工作線線程的數目。防止由於消耗過多的內存。而把server累趴下(每一個線程須要大約1MB內存。線程開的越多。消耗的內存也就越大。最后死機)

Java里面線程池的頂級接口是Executor。可是嚴格意義上講Executor並非一個線程池,而僅僅是一個運行線程的工具。真正的線程池接口是ExecutorService

經常使用的線程池:

1. newSingleThreadExecutor

創建一個單線程的線程池。這個線程池僅僅有一個線程在工作,也就是相當於單線程串行運行全部任務。假設這個唯一的線程由於異常結束,那么會有一個新的線程來替代它。此線程池保證全部任務的運行順序依照任務的提交順序運行。

2. newFixedThreadPool

創建固定大小的線程池。每次提交一個任務就創建一個線程。直到線程達到線程池的最大大小。線程池的大小一旦達到最大值就會保持不變。假設某個線程由於運行異常而結束,那么線程池會補充一個新線程。

3. newCachedThreadPool

創建一個可緩存的線程池。

假設線程池的大小超過了處理任務所須要的線程。

那么就會回收部分空暇(60秒不運行任務)的線程,當任務數添加時。此線程池又可以智能的加入新線程來處理任務。此線程池不會對線程池大小做限制,線程池大小全然依賴於操作系統(或者說JVM)可以創建的最大線程大小。

4. newScheduledThreadPool

創建一個大小無限的線程池。

此線程池支持定時以及周期性運行任務的需求。

實例:

package cn.itcast.lesson9;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolTest {

	public static void main(String[] args) {
		//固定了線程池中的線程。
		//ExecutorService threadPool = Executors.newFixedThreadPool(3);
		//緩存型池子,動態的添加降低線程
		//ExecutorService threadPool = Executors.newCachedThreadPool();
		//單一線程池
		//ExecutorService threadPool = Executors.newSingleThreadExecutor();
		//調度型線程池
		ExecutorService threadPool = Executors.newScheduledThreadPool(3);
		for(int i=1;i<=10;i++){
			final int task = i;
			threadPool.execute(new Runnable() {
				
				public void run() {
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					for(int j=1;j<=5;j++){
						System.out.println(Thread.currentThread().getName()+
								" is looping of "+j+" for task of "+task);
					}
				}
			});
		}
		System.out.println("all of 10 tasks has committed");
		threadPool.shutdown();
	}
}

Executorexecute()方法

execute() 方法將Runnable實例增加pool,並進行一些pool size計算和優先級處理

execute() 方法本身在Executor接口中定義,有多個實現類都定義了不同的execute()方法


版權聲明:本文博客原創文章,博客,未經同意,不得轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM