1. 程式人生 > >高階面試題總結—執行緒池還能這麼玩?

高階面試題總結—執行緒池還能這麼玩?

前言

面試中我們經常會遇到多執行緒和執行緒池的問題,究竟如何回答呢?今天關於Java中的執行緒池,我們就來學習一下。

什麼是執行緒池

執行緒池是指在初始化一個多執行緒應用程式過程中建立一個執行緒集合,然後在需要執行新的任務時重用這些執行緒而不是新建一個執行緒。執行緒池中執行緒的數量通常完全取決於可用記憶體數量和應用程式的需求。然而,增加可用執行緒數量是可能的。執行緒池中的每個執行緒都有被分配一個任務,一旦任務已經完成了,執行緒回到池子中並等待下一次分配任務。

說白了就是為一應用執行多個執行緒的一個執行緒集合體

為什麼需要執行緒池?

使用執行緒池,我目前解決了一下問題:
- 利用執行緒池, 獲取一個視訊中的多個封面,從而節約了一些時間和資源
- 後臺伺服器不支援多張圖片上傳,利用執行緒池,進行多張圖片上傳,從而減少上傳的時間

效果圖如下:

456.gif

上傳前:9張圖片至少要用3秒,利用執行緒池優化之後, 9張圖片要用1秒。

基於以下幾個原因在多執行緒應用程式中使用執行緒是必須的:

  • 1.減少了建立和銷燬執行緒的次數,每個工作執行緒都可以被重複利用,可執行多個任務。

  • 2.可以根據系統的承受能力,調整執行緒池中工作線執行緒的數目,防止因為消耗過多的記憶體,而把伺服器累趴下(每個執行緒需要大約1MB記憶體,執行緒開的越多,消耗的記憶體也就越大,最後宕機)。

    1. 執行緒池改進了一個應用程式的響應時間。由於執行緒池中的執行緒已經準備好且等待被分配任務,應用程式可以直接拿來使用而不用新建一個執行緒。
    1. 執行緒池節省了CLR 為每個短生存週期任務建立一個完整的執行緒的開銷並可以在任務完成後回收資源。
    1. 執行緒池根據當前在系統中執行的程序來優化執行緒時間片。
    1. 執行緒池允許我們開啟多個任務而不用為每個執行緒設定屬性。
    1. 執行緒池允許我們為正在執行的任務的程式引數傳遞一個包含狀態資訊的物件引用。
    1. 執行緒池可以用來解決處理一個特定請求最大執行緒數量限制問題。

執行緒池的作用:

執行緒池作用就是限制系統中執行執行緒的數量。
根據系統的環境情況,可以自動或手動設定執行緒數量,達到執行的最佳效果;少了浪費了系統資源,多了造成系統擁擠效率不高。用執行緒池控制執行緒數量,其他執行緒排 隊等候。一個任務執行完畢,再從佇列的中取最前面的任務開始執行。若佇列中沒有等待程序,執行緒池的這一資源處於等待。當一個新任務需要執行時,如果執行緒池 中有等待的工作執行緒,就可以開始運行了;否則進入等待佇列。

單執行緒的弊端

舉個例子
“`
new Thread(new Runnable() {

@Override
public void run() {
paPaPaYourGridFriend();
}
}).start();

###### 重要的事情說三遍!!!
**如果你還在用new Thread執行一個非同步任務,so你就Out了!**
**如果你還在用new Thread執行一個非同步任務,so你就Out了!**
**如果你還在用new Thread執行一個非同步任務,so你就Out了!**

###### 弊端如下:
- a. 每次new Thread新建物件效能差。
- b. 執行緒缺乏統一管理,可能無限制新建執行緒,相互之間競爭,及可能佔用過多系統資源導致宕機或oom。
- c. 缺乏更多功能,如定時執行、定期執行、執行緒中斷。

#### 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. 提供定時執行、定期執行、單執行緒、併發數控制等功能。

執行緒池真的是太好用了,如果在專案中通過執行緒池管理執行緒,,你將會發現其中的諸多優勢!

閱讀更多

相信自己,沒有做不到的,只有想不到的

在這裡獲得的不僅僅是技術!

相關推薦

高階試題總結執行這麼

前言 面試中我們經常會遇到多執行緒和執行緒池的問題,究竟如何回答呢?今天關於Java中的執行緒池,我們就來學習一下。 什麼是執行緒池 執行緒池是指在初始化一個多執行緒應用程式過程中建立一個執行緒集合,然後在需要執行新的任務時重用這些執行緒而不是新建一個

試題執行 順序操作

問題 編寫一個程式,程式會啟動4個執行緒,向4個檔案A,B,C,D裡寫入資料,每個執行緒只能寫一個值。 執行緒A:只寫1 執行緒B:只寫2 執行緒C:只寫3 執行緒D:只寫4 4個檔案A,B,C,D。 程式執行起來,4個檔案的寫入結果如下:

自己實戰整理試題--多執行(帶答案,不斷更新)

一個執行緒兩次呼叫 start() 方法會出現什麼情況?執行緒的生命週期,狀態是如何轉移的? Java 的執行緒是不允許啟動兩次的,第二次呼叫必然會丟擲 IllegalThreadStateException,這是一種執行時異常,多次呼叫 start 被認為是程式設計錯誤。 關於執行緒生

Java試題執行

1、Thread類中的yield方法有什麼作用? Yield方法可以暫停當前正在執行的執行緒物件,讓其它有相同優先順序的執行緒執行。它是一個靜態方法而且只保證當前執行緒放棄CPU佔用而不能保證使其它執行緒一定能佔用CPU,執行yield()的執行緒有可能在進入到暫停狀態後馬上又

Java試題--多執行併發&鎖&jvm

一 多執行緒、併發、鎖 執行緒的生命週期,狀態是如何轉移的 NEW:A thread that has not yet started is in this state. RUNABLE: A thread executing in the Java vi

2018年一線網際網路公司Java高階試題總結

1、hashcode相等兩個類一定相等嗎?equals呢?相反呢? 2、介紹一下集合框架? 3、hashmap hastable 底層實現什麼區別?hashtable和concurrenthashtable呢? 4、hashmap和treemap什麼區別?低層資料結構是

單例模式的七種寫法, 試題執行安全的單例模式

http://cantellow.iteye.com/blog/838473 http://meizhi.iteye.com/blog/537563 第一種(懶漢,執行緒不安全): Java程式碼   public class Singleton {  

2018年JAVA基礎試題高階試題總結

Java面試前需要做足各方面的準備工作,肯定都會瀏覽大量的面試題,本人也不例外,通過瀏覽面試題和以往的面試經歷,總結了從初級到中級以及高階的面試題,供大家學習討論。 更多推薦↓↓↓ Jav

Java試題——多執行高併發

什麼是執行緒? 執行緒是程序中的一個實體,是被系統獨立排程和分派的基本單位,它被包含在程序之中,是程序中的實際運作單位。執行緒自己不擁有系統資源,只擁有一點兒在執行中必不可少的資源,但它可與同屬一個程序的其它執行緒共享程序所擁有的全部資源。一個執行緒可以建立

一線網際網路公司Java高階試題總結

不管是開發、測試、運維,每個技術人員心裡都有一個成為技術大牛的夢,畢竟“夢想總是要有的,萬一實現了呢”!正是對技術夢的追求,促使我們不斷地努力和提升自己。 今天分享Java重點面試知識 : 多執行緒(執行緒狀態、執行緒併發,Synchronized與Lock的區別和底

C++試題二---執行與程序

經典的執行緒與程序的面試題 1、 執行緒的基本概念、執行緒的基本狀態及狀態之間的關係? 概念:執行緒是程序中執行運算的最小單位,是程序中的一個實體,是被系統獨立排程和分派的基本單位,執行緒自己不擁有系統資源,只擁有一點在執行中必不可少的資源,但它可與同

客觀試題--8.執行的生命週期是什麼?執行建立有幾種方式?

1.執行緒的生命週期執行緒是一個動態執行的過程,它也有一個從產生到死亡的過程。(1)生命週期的五種狀態新建(new Thread)當建立Thread類的一個例項(物件)時,此執行緒進入新建狀態(未被啟動)。例如:Thread  t1=new Thread();就緒(runna

BATJ等一線網際網路公司Java高階試題總結

開發十年,就只剩下這套架構體系了! >>>   

試題-使用執行交替列印奇數偶數

這世上有三樣東西是別人搶不走的:一是吃進胃裡的食物,二是藏在心中的夢想,三是讀進大腦的書 分析題目。需要使用兩個執行緒交替列印奇偶數。 使用同步鎖解決這個問題 使用訊號量來實現交替列印 定義兩個訊號量,一個奇數訊號量,一個偶數訊號量,都初始化為1 先用掉偶數的訊號量,因為要讓奇數先啟動,等奇數列

JAVA試題 啟動執行是start()還是run()?為什麼?

面試官:請問啟動執行緒是start()還是run()方法,能談談嗎? 應聘者:start()方法 當用start()開始一個執行緒後,執行緒就進入就緒狀態,使執行緒所代表的虛擬處理機處於可執行狀態,這意味著它可以由JVM排程並執行。但是這並不意味著執行緒就會立即執行。只有當cpu分配時間片時,這個執行緒獲得時

執行為什麼維持執行不釋放,隨時執行各種任務?

執行緒池 之前一直有這個疑問:我們平時使用執行緒都是各種new Thread(),然後直接在run()方法裡面執行我們要做的各種操作,使用完後需要做什麼管理嗎?執行緒池為什麼能維持住核心執行緒不釋放,一直接收任務進行處理呢? 執行緒 執行緒無他,主要有兩個方法

手遊這麼?電腦控制手機滑鼠鍵盤大屏手遊了解一下

玩手遊還在做手搓黨?2018手遊新玩法:手機投屏加電腦控制,無需安卓模擬器,不過多佔用電腦記憶體也能在電腦上大屏玩手遊,還能匹配手機玩家瞭解一下。 工具: TC Games電腦玩手機遊戲助手(非模擬器)電腦端和手機端工具軟體、安卓手機、USB資料線 操作方法: 1、先在電腦端下

Linux 這麼,10 個非常有趣的命令!

Linux當中有很多比較有趣的命令,可以動手看看,很簡單的。 1.rev命令 一行接一行地顛倒所輸入的字串。 執行: $rev 如輸入:shiyanlou shiyanlou   2.asciiview命令 1.先安裝aview

IntelliJ IDEA 2018.1正式釋出!什麼?這麼

工欲善其事必先利其器,如果有一款IDE可以讓你更高效地專注於開發以及原始碼閱讀,為什麼不試一試?3月27日,jetbrains正式釋出期待已久的IntelliJ IDEA 2018.1,再次讓人眼前一亮:什麼,還能這麼玩?下面,我們來快速瞭解一下 IDEA 2018.1 最新版本給我們帶來哪些驚喜1. str

Docker竟然這麼?商業級4G代理搭建實戰!

時間過得真快,距離這個系列的上一篇文章《商業級4G代理搭建指南【準備篇】》釋出的時間已經過了兩個星期了,上個星期由於各種瑣事纏身,週二開始就沒空寫文章了,所以就咕咕咕了。 那麼在準備篇中,我們瞭解了一下搭建 4G 代理所需要的軟硬體,也知道了各種選擇的優劣勢。現在,我們就可以開始實際搭建了,相信大家也是期待已