JAVA線程池的原理分析

線程池的做用緩存

  1.下降資源的消耗ide

  2.提升效率this

  3.方便管理spa

相關概念線程

  corePoolSize核心線程數:核心池的大小,當有任務到達以後,就會建立一個線程去執行任務,當任務數量到達核心線程數後,就會把到達的任務放到緩存隊列中去。code

  maximumPoolSize: 線程池最大線程數,它表示在線程池中最多能建立多少個線程。blog

  keepAliveTime:表示線程沒有任務執行是,最多保持多久的時間就會終止。隊列

  unit:參數keepAliveTime的時間單位,有7種取值,具體在TimeUnit類中。資源

線程池運行原理:get

     1.原理剖析

     提交一個任務到線程池中,線程池的處理流程以下:

    ①判斷線程池裏的核心線程是否都在執行任務,若是不是(核心線程空閒或者還有核心線程沒有被建立)則建立一個新的工做線程來執行任務。若是核心線程都在執行任      務,則進入下個流程。

    ②線程池判斷工做隊列是否已滿,若是工做隊列沒有滿,則將新提交的任務存儲在這個工做隊列裏。若是工做隊列滿了,則進入下個流程。

    ③判斷線程池裏的線程是否都處於工做狀態,若是沒有,則建立一個新的工做線程來執行任務。若是已經滿了,則交給飽和策略來處理這個任務。

  

線程池的使用:

  1.自定義線程池注意事項

  若是當前線程池中的線程數目小於corePoolSize,則每來一個任務,就會建立一個線程去執行這個任務;

  若是當前線程池中的線程數目>=corePoolSize,則每來一個任務,會嘗試將其添加到任務緩存隊列當中,若添加成功,則該任務會等待空閒線程將其取出去執行;若添加失敗    (通常來講是任務緩存隊列已滿),則會嘗試建立新的線程去執行這個任務;

  若是隊列已經滿了,則在總線程數不大於maximumPoolSize的前提下,則建立新的線程

  若是當前線程池中的線程數目達到maximumPoolSize,則會採起任務拒絕策略進行處理;

  若是線程池中的線程數量大於 corePoolSize時,若是某線程空閒時間超過keepAliveTime,線程將被終止,直至線程池中的線程數目不大於corePoolSize;若是容許爲核心池中  的線程設置存活時間,那麼核心池中的線程空閒時間超過keepAliveTime,線程也會被終止。

 

  2.代碼編寫:

public class MyThreadpoll {
    public static void main(String[] args) {
        ThreadPoolExecutor th = new ThreadPoolExecutor(1, 2, 0L, TimeUnit.MICROSECONDS, new LinkedBlockingQueue<>(3));
        
        for (int i = 0; i < 6; i++) {
            TaskThread tt = new TaskThread("任務 " + i);
            th.execute(tt);
        }
        
        th.shutdown();
    }
}

class TaskThread implements Runnable {
    
    private String threadName;
    
    public TaskThread(String threadName) {
        this.threadName = threadName;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + ": " + threadName);
        
    }
    
}

  根據上述的原理分析能夠看出,當for循環運行到  i = 5時也就是運行第6個線程時,程序拋出異常

相關文章
相關標籤/搜索