欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java線程池高頻面試題總結(jié)

 更新時間:2021年08月12日 11:03:36   作者:灰小猿  
在進程和線程的相關(guān)面試題中還有一部分是關(guān)于多線程和線程池的,也是在這一部分中比較??疾斓膬?nèi)容。本篇文章就帶你了解一下,希望能給你帶來幫助

1、在啟動線程時,為什么要通過調(diào)用方法start執(zhí)行方法run,而不能直接執(zhí)行方法run?

調(diào)用方法start執(zhí)行方法run,才是多線程的工作,**如果直接執(zhí)行方法run,會被當成一個主線程下的普通方法執(zhí)行,**而不會在某個線程中執(zhí)行,因此不是多線程工作。

2、方法sleep、join和yield的區(qū)別有哪些?

方法sleep的作用是使當前線程暫停執(zhí)行一段時間,讓其他線程有機會繼續(xù)執(zhí)行;

方法join的作用是阻塞調(diào)用該方法的線程,直到當前線程執(zhí)行完畢后,調(diào)用該方法的線程才能繼續(xù)執(zhí)行;

方法yield的作用是暫停當前正在執(zhí)行的線程對象,并執(zhí)行其他線程。

3.為什么方法wait、notify和notifyAll在Object類定義,而不在Thread類定義?

其中主要的原因是:

方法 wait、notify 和 notifyAll 不只是普通方法或同步工具,它們還是 Java 中兩個線程之間的通信機制。對語言設計者而言, 如果不能通過 Java 關(guān)鍵字(例如 synchronized)實現(xiàn)通信機制,同時又要確保這個機制對每個對象可用,那么 Object 類則是的合理的聲明位置。每個對象都可上鎖,因此方法 wait 和 notify 在 Object 類而不是 Thread 類定義。

4、終止線程應該使用什么方法?為什么不推薦使用stop和destroy方法來終止線程?

終止線程應該使用方法interrupt,使用方法stop會帶來兩個問題,

一是清理性工作無法完成;

二是會立即釋放所有鎖,導致對象狀態(tài)不一致。因此會造成不安全。

而方法destroy除了拋出NoSuchMethodError 以外沒有做任何事情,因此無法終止線程。

5、什么是線程池?

線程池是一種線程的使用模式,創(chuàng)建若干個可執(zhí)行的線程放入一個池(容器)中,有任務需要處理時,會提交到線程池中的任務隊列,處理完后線程并不會被銷毀,而是仍然在線程池中等待下一個任務。

6、追問:線程池的好處有哪些?

使用線程池有以下三點好處:

  • 降低資源消耗,重復利用線程池中已經(jīng)創(chuàng)建的資源,可以避免頻繁的創(chuàng)建和銷毀線程,從而減少資源的消耗。
  • 提高響應速度,由于線程池中有已經(jīng)創(chuàng)建的線程,因此當任務到達時可以直接執(zhí)行。不需要等待線程的創(chuàng)建。
  • 提高線程的可管理性,線程是稀缺資源,如果無限制的創(chuàng)建,不僅會消耗系統(tǒng)資源,還會降低系統(tǒng)的穩(wěn)定性,使用線程池可以進行統(tǒng)一分配、調(diào)優(yōu)和監(jiān)控。

7、說一說線程池是如何創(chuàng)建的?

線程池的創(chuàng)建可以通過ThreadPoolExecutor類,

ThreadPoolExecutor類有4個構(gòu)造方法,其中最一般話的構(gòu)造方法包含7個參數(shù)。

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

這7個參數(shù)的含義分別是:

  • corePoolSize: 核心線程數(shù),定義了最少可以同時運行的線程數(shù)量,當有新的任務時就會創(chuàng)建一個線程執(zhí)行任務,當線程池中的線程數(shù)量達到corePoolSize 之后,到達的任務進入阻塞隊列
  • maximumPoolSize: 最大線程數(shù),定義了線程池中最多能創(chuàng)建的線程數(shù)量。
  • keepAliveTime: 等待時間,當線程池中的線程數(shù)量大于 corePoolSize 時,如果一個線程的空閑時間達到keepAliveTime 時則會終止,直到線程池中的線程數(shù)不超過 corePoolSize。
  • unit: 參數(shù)keepAliveTime 的單位。
  • workQueue: 阻塞隊列,用來存儲等待執(zhí)行的任務。
  • threadFactory: 創(chuàng)建線程的工廠。
  • handler: 當拒絕處理任務時的策略。

8、向線程池提交任務的流程是什么?

  • 如果正在運行的線程數(shù)量小于corePoolSize,則創(chuàng)建核心線程運行這個任務。
  • 如果正在運行的線程數(shù)量大于或等于corePoolSize,則將這個任務放入阻塞隊列。
  • 如果阻塞隊列滿了,而且正在運行的線程數(shù)量小于maximumPoolSize,則創(chuàng)建非核心線程運行這個任務
  • 如果阻塞隊列滿了,而且正在運行的線程數(shù)量大于或等于 maximumPoolSize,則線程池拋出RejectExecutionException 異常。

9、追問:說一說核心線程和非核心線程的區(qū)別?

核心線程和非核心線程的最大數(shù)目在創(chuàng)建線程時被鎖定,核心線程和非核心線程的區(qū)別如下:

  • 向線程池提交任務時,首先創(chuàng)建核心線程運行任務,直到核心線程數(shù)達到上限,然后將任務放入阻塞隊列。
  • 只有在核心線程數(shù)到達上限,且阻塞隊列滿的情況下,才會創(chuàng)建非核心線程運行任務。

10、如何關(guān)閉線程池?

可以通過調(diào)用線程池的方法shutdown或shutdownNow關(guān)閉線程池,

這兩個方法的原理是 遍歷線程池中的工作線程,對每個工作線程調(diào)用 interrupt 方法中斷線程,無法響應中斷的任務可能永遠無法終止。

方法 shutDown 和 shutDownNow 有以下區(qū)別。
方法 shutDown 將線程池的狀態(tài)設置成 SHUTDOWN,正在執(zhí)行的任務繼續(xù)執(zhí)行,沒有執(zhí)行的任務將中斷。
方法 shutDownNow 將線程池的狀態(tài)設置成 STOP,正在執(zhí)行的任務被停止,沒有執(zhí)行的任務被返回。

總結(jié)

多線程以及線程池相關(guān)的面試其實主要就是考察是否真正的使用過多線程和線程池開發(fā),所以主要就是掌握多線程和線程池的創(chuàng)建和銷毀方法、了解線程池的原理。重點在于實踐。

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 多個java泛型示例分享

    多個java泛型示例分享

    這篇文章主要介紹了多個java泛型示例,需要的朋友可以參考下
    2014-04-04
  • Spring和SpringBoot之間的區(qū)別

    Spring和SpringBoot之間的區(qū)別

    這篇文章主要介紹了Spring和SpringBoot之間的區(qū)別,幫助大家更好的理解和學習使用這兩種框架,感興趣的朋友可以了解下
    2021-04-04
  • Java開發(fā)崗位面試被問到嵌套類怎么辦

    Java開發(fā)崗位面試被問到嵌套類怎么辦

    本篇文章主要介紹了深入理解Java嵌套類和內(nèi)部類,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-07-07
  • Springcloud基于OpenFeign實現(xiàn)服務調(diào)用代碼實例

    Springcloud基于OpenFeign實現(xiàn)服務調(diào)用代碼實例

    這篇文章主要介紹了Springcloud基于OpenFeign實現(xiàn)服務調(diào)用代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Java util.List如何實現(xiàn)列表分段處理

    Java util.List如何實現(xiàn)列表分段處理

    這篇文章主要介紹了Java util.List如何實現(xiàn)列表分段處理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • 關(guān)于Mybatis插入對象時空值的處理

    關(guān)于Mybatis插入對象時空值的處理

    這篇文章主要介紹了關(guān)于Mybatis插入對象時空值的處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 詳解Spring 中 Bean 的生命周期

    詳解Spring 中 Bean 的生命周期

    這篇文章主要介紹了Spring 中 Bean 的生命周期的相關(guān)資料,幫助大家更好的理解和使用spring框架,感興趣的朋友可以了解下。
    2021-01-01
  • Java前后端的JSON傳輸方式(前后端JSON格式轉(zhuǎn)換)

    Java前后端的JSON傳輸方式(前后端JSON格式轉(zhuǎn)換)

    這篇文章主要介紹了Java前后端的JSON傳輸方式(前后端JSON格式轉(zhuǎn)換),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java多線程的同步優(yōu)化的6種方案

    Java多線程的同步優(yōu)化的6種方案

    大家使用多線程無非是為了提高性能,在Java中,有多線程并發(fā)時,我們可以使用多線程同步的方式來解決內(nèi)存一致性的問題。本文就詳細的介紹了Java多線程同步優(yōu)化,感興趣的可以了解一下
    2021-05-05
  • Java Servlet3.0異步處理問題

    Java Servlet3.0異步處理問題

    這篇文章主要介紹了Java中Servlet3.0異步處理的原理以及遇到的問題分析,需要的朋友參考一下。
    2017-12-12

最新評論