Java多執行緒之執行緒池

 

/*
*作者:呆萌老師
*☑csdn認證講師
*☑51cto高級講師
*☑騰訊課堂認證講師
*☑網易雲課堂認證講師
*☑華為開發者學堂認證講師
*☑愛奇藝千人名師計劃成員
*在這裡給大家分享技術、知識和生活
*各種乾貨,記得關注哦!
*vx:it_daimeng
*/

  

1、什麼是執行緒池

        在java中,如果每個請求到達就創建一個新執行緒,開銷是相當大的。在實際使用中,創建和銷毀執行緒花費的時間和消耗的系統資源都相當大,甚至可能要比在處理實際的用戶請求的時間和資源要多的多。除了創建和銷毀執行緒的開銷之外,活動的執行緒也需要消耗系統資源。如果在一個jvm里創建太多的執行緒,可能會使系統由於過度消耗記憶體或「切換過度」而導致系統資源不足。為了防止資源不足,需要採取一些辦法來限制任何給定時刻處理的請求數目,儘可能減少創建和銷毀執行緒的次數,特別是一些資源耗費比較大的執行緒的創建和銷毀,盡量利用已有對象來進行服務。

執行緒池主要用來解決執行緒生命周期開銷問題和資源不足問題。通過對多個任務重複使用執行緒,執行緒創建的開銷就被分攤到了多個任務上了,而且由於在請求到達時執行緒已經存在,所以消除了執行緒創建所帶來的延遲。這樣,就可以立即為請求服務,使用應用程式響應更快。另外,通過適當的調整執行緒中的執行緒數目可以防止出現資源不足的情況。

 

public class Thread1 implements Runnable {

	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName()+"在執行任務");
		// TODO Auto-generated method stub
		for(int i=1;i<=100;i++)
			System.out.println("a..."+i);
		
	}
	
	

}

  

public class Thread2 implements Runnable {
	
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName()+"在執行任務");
		// TODO Auto-generated method stub
		for(int i=1;i<=100;i++)
			System.out.println("b..."+i);
		
	}

}

  

public class Thread3 implements Runnable {
	
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName()+"在執行任務");
		// TODO Auto-generated method stub
		for(int i=1;i<=100;i++)
			System.out.println("c..."+i);
		
	}

}

  

從執行緒池中取出執行緒對象執行任務,任務執行完畢 ,會返回到執行緒池中. 

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
    
        //1.創建執行緒池
        ExecutorService pool=  Executors.newFixedThreadPool(2);
        
        //2.給執行緒池分配任務
        pool.submit(new Thread1());
        
        pool.submit(new Thread2());
        
        pool.submit(new Thread3());
        
        pool.shutdown(); //銷毀執行緒池 一般不用銷毀
        
        
    }

}
 

​