這篇文章給大家介紹的內容是關於面試中可能會遇到的關於線程池的問題,有著一定的參考價值,有需要的朋友可以參考一下。
前言
面試中我們經常會遇到多線程和線程池的問題,究竟如何回答呢?今天關於Java中的線程池,我們就來學習一下。
什麼是線程池
線程池是指在初始化一個多線程應用程式過程中建立一個線程集合,然後在需要執行新的任務時重用這些線程而不是建立一個線程。線程池中線程的數量通常完全取決於可用記憶體數量和應用程式的需求。然而,增加可用線程數量是可能的。線程池中的每個線程都有被分配一個任務,一旦任務已經完成了,線程回到池子中並等待下一次分配任務。
說白了就是為一應用執行多個線程的一個線程集合體。
為什麼需要線程池?
使用線程池,我目前解決了一下問題:
如下:
上傳前:9張圖片至少要用3秒,利用線程池最佳化之後, 9張圖片要用1秒。
基於以下幾個原因在多線程應用程式中使用線程是必須的:
安撫多歲的發發發
線程池的作用:
線程池作用就是限制系統中執行線程的數量。
根據系統的環境情況,可以自動或手動設定線程數量,達到啟動並執行最佳效果;少了浪費了系統資源,多了造成系統擁擠效率不高。用線程池控制線程數量,其他線程排 隊等候。一個任務執行完畢,再從隊列的中取最前面的任務開始執行。若隊列中沒有等待進程,線程池的這一資源處於等待。當一個新任務需要運行時,如果線程池 中有等待的背景工作執行緒,就可以開始運行了;否則進入等待隊列。
單線程的弊端
舉個例子
new Thread(new Runnable() {@Overridepublic void run() { paPaPaYourGridFriend();}}).start();
重要的事情說三遍!!!
如果你還在用new Thread執行一個非同步任務,so你就Out了!
如果你還在用new Thread執行一個非同步任務,so你就Out了!
如果你還在用new Thread執行一個非同步任務,so你就Out了!
弊端如下:
Java 線程池
1. newSingleThreadExecutor
建立一個單線程的線程池。這個線程池只有一個線程在工作,也就是相當於單線程串列執行所有任務。如果這個唯一的線程因為異常結束,那麼會有一個新的線程來替代它。此線程池保證所有任務的執行順序按照任務的提交順序執行。
2.newFixedThreadPool
建立固定大小的線程池。每次提交一個任務就建立一個線程,直到線程達到線程池的最大大小。線程池的大小一旦達到最大值就會保持不變,如果某個線程因為執行異常而結束,那麼線程池會補充一個新線程。
3. newCachedThreadPool
建立一個可快取的線程池。如果線程池的大小超過了處理任務所需要的線程,
那麼就會回收部分空閑(60秒不執行任務)的線程,當任務數增加時,此線程池又可以智能的添加新線程來處理任務。此線程池不會對線程池大小做限制,線程池大小完全依賴於作業系統(或者說JVM)能夠建立的最大線程大小。
4.newScheduledThreadPool
建立一個大小無限的線程池。此線程池支援定時以及周期性執行任務的需求。
newSingleThreadExecutor
private void TextnewSingleThreadExecutor(){ ExecutorService pool = Executors. newSingleThreadExecutor(); MyTask1 task1 = new MyTask1(); MyTask2 task2 = new MyTask2(); MyTask3 task3 = new MyTask3();// pool.execute(task1);// pool.execute(task2);// pool.execute(task3); new Thread(task1).start(); new Thread(task2).start(); new Thread(task3).start(); } private class MyTask1 implements Runnable{ @Override public void run() { //迴圈輸出 for(int i = 0; i < 100; i++) { System.out.print("A"+i+"\t"); } } } private class MyTask2 implements Runnable{ @Override public void run() {// try {// Thread.sleep(1000);// } catch (InterruptedException e) {// e.printStackTrace();// } //迴圈輸出 for(int i = 0; i < 100; i++) { System.out.print("B"+i+"\t"); } } } private class MyTask3 implements Runnable{ @Override public void run() { //迴圈輸出 for(int i = 0; i < 100; i++) { System.out.print("C"+i+"\t"); } } }
ScheduledExecutorService
newFixedThreadPool
newCachedThreadPool
相比new Thread,Java提供的四種線程池的好處在於:
a. 重用存在的線程,減少對象建立、消亡的開銷,效能佳。
b. 可有效控制最大並發線程數,提高系統資源的使用率,同時避免過多資源競爭,避免堵塞。
c. 提供定時執行、定期執行、單線程、並發數控制等功能。
線程池真的是太好用了,如果在項目中通過線程池管理線程,,你將會發現其中的諸多優勢!
閱讀更多
20+個很棒的Android開源項目
2018年Android面試題含答案--適合中進階(下)一份完整的Android Studio搭建Flutter教程[](http://mp.weixin.qq.com/s?__b...
深入瞭解JAVA的線程中斷方法經驗之總結
子線程為什麼不能更新UI線程詳解
相信自己,沒有做不到的,只有想不到的