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(); } }Executor的execute()方法
execute() 方法將Runnable實例增加pool中,並進行一些pool size計算和優先級處理
execute() 方法本身在Executor接口中定義,有多個實現類都定義了不同的execute()方法
版權聲明:本文博客原創文章,博客,未經同意,不得轉載。