多線程-題

1、進程和線程之間有什么不同?

一個進程是一個獨立(self contained)的運行環境,它可以被看作一個程序或者一個應用。而線程是在進程中執行的一個任務。java運行環境是一個包含了不同的類和程序的單一進程。線程可以被稱為輕量級進程。線程需要較少的資源來創建和駐留在進程中,并且可以共享進程中的資源。

2、多線程編程的好處是什么?

在多線程程序中,多個線程被并發的執行以提高程序的效率,CPU不會因為某個線程需要等待資源而進入空閑狀態。多個線程共享堆內存(heap memory),因此創建多個線程去執行一些任務會比創建多個進程更好。舉個例子,Servlet比CGI更好,是因為Servlets支持多線程而CGI不支持。

3、用戶線程和守護線程有什么區別?

當我們在java程序中創建一個線程,它就被稱為用戶線程。一個守護線程是在后臺執行并且不會阻止JVM終止的線程。當沒有用戶線程在運行的時候,JVM關閉程序并且退出。一個守護線程創建的子線程依然是守護線程。

4、如何創建一個線程?

有三種創建線程的方法:

一是實現Runnable接口,然后將它傳遞給Thread的構造函數,創建一個Thread對象;

new Thread(new Runnable(){

???????? public void run(){

?????????????????? //重寫run方法

}

}).start();

?

二是直接繼承Thread類。

new Thread(){

???????? public void run(){

?????????????????? //重寫run方法

}

}.start();

?

三使用Callable和Future創建線程。

public class CallableThread implements Callable<String>

{

???????? public static void main(String[] args)

???????? {

?????????????????? CallableThread ct = new CallableThread();

?????????????????? FutureTask<String> ft = new FutureTask<String>(ct);

?????????????????? System.out.println(ft.get());

}

?

@Override

public String call() throws Exception

{

???????? return “線程的第三種創建方法”

}

}

5、線程的生命周期?

a、新建(NEW):新創建了一個線程對象

b、可運行(RUNNABLE):線程對象創建后,其他線程(比如main線程)調用了該對象的start()方法。該狀態的線程位于可運行線程池中,等待被線程調度選中,獲取CPU的使用權。

c、運行(RUNNING):可運行狀態(Runnable)的線程獲得了CPU時間片(timeslice),執行程序代碼。

d、阻塞(BLOCKED):阻塞狀態是指線程因為某種原因放棄了CPU使用權,也既讓出了CPU timeslice,暫時停止運行。直到線程進入可運行(runnable)狀態,才有機會再次獲得CPU timeslice轉到運行(running)狀態。阻塞的情況分三種:

(一)等待阻塞:運行(running)的線程執行o.wait()方法,JVM會把該線程放入等待隊列(waitting queue)中。

(二)同步阻塞:運行(running)的線程在獲取對象的同步時。若該同步鎖被別的線程占用,則JVM會把該線程放入鎖池(lock pool)中。

(三)其他阻塞:運行(running)的線程執行Thread.sleep(long ms)或t.join()方法,或者發出了I/O請求時,JVM會把該線程置為阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入可運行(running)狀態。

e、死亡(DEAD):線程run(),main()方法執行結束,或因為異常退出了run()方法,則該線程結束生命周期。死亡的線程不可再次復生。

?

6、可以直接調用Thread類的run()方法嗎?

當然可以,但是如果我們調用了Thread的run()方法,它的行為就會和普通的方法一樣,為了在新的線程中執行我們的代碼,必須使用Thread.start()方法。

7、如何讓正在運行的線程暫停一段時間?

我們可以使用Thread類的Sleep()方法讓線程暫停一段時間。需要注意的是,這并不會讓線程終止,一旦從休眠中喚醒線程,線程的狀態將會被改變為Runnable,并且根據線程調度,它將得到執行。

8、你對線程優先級的理解是什么?

每一個線程都是有優先級的,一般來說,高優先級的線程在運行時會具有優先權,但這依賴于線程調度的實現,這個實現是和操作系統相關的(OS dependent)。我們可以定義線程的優先級,但是這并不能保證高優先級的線程會在低優先級的線程前執行。線程優先級是一個int變量(從1-10),1代表最低優先級,10代表最高優先級。

9、什么是線程調度器(Thread Scheduler)和時間分片(Time Slicing)?

線程調度器是一個操作系統服務,它負責為Runnable狀態的線程分配CPU時間。一旦我們創建一個線程并啟動它,它的執行便依賴于線程調度器的實現。時間分片是指將可用的CPU時間分配給可用的Runnable線程的過程。分配CPU時間可以基于線程優先級或者線程等待的時間。線程調度并不受到java虛擬機控制,所以由應用程序來控制它是更好的選擇(也就是說不要讓你的程序依賴于線程的優先級)。

10、在多線程中,什么是上下文切換(context-switching)?

上下文切換是存儲和恢復CPU狀態的過程,它使得線程執行能夠從中斷點恢復執行。上下文切換是多任務操作系統和多線程環境的基本特征。

11、你如何確保main()方法所在的線程是java程序最后結束的線程?

我們可以使用Thread類和join()方法來確保所有程序創建的線程在main()方法退出前結束。

當線程間是可以共享資源時,線程間通信是協調他們的重要手段。Object類中wait(),notify(),notifyAll()方法可以用于線程間通訊關于資源的鎖的狀態。

12、為什么線程通信的方法wait(),notify()和notifyAll()被定義在Object類里?

java的每個對象中都有一個鎖(monitor,也可以稱為監視器),并且wait(),notify()等方法用于等待對象的鎖或者通知其他線程對象的監視器可用。在java的線程中并沒有可供任何對象使用的鎖和同步器。這就是為什么這些方法是Object類的一部分,這樣java的每一個類都有用于線程間通信的基本方法。

13、為什么wait(),notify()和notifyAll()必須在同步方法或者同步塊中被調用?

當一個線程需要調用對象的wait()方法的時候,這個線程必須擁有該對象的鎖,接著它就會釋放這個對象鎖并進入等待狀態直到其他線程調用這個對象上的notify()方法。同樣的,當一個線程需要調用對象的notify()方法時,它會釋放這個對象的鎖,以便其他在等待的線程就可以得到這個對象鎖。由于所有的這些方法都需要線程持有對象的鎖,這樣就只能通過同步來實現,所以他們只能在同步方法或者同步塊中被調用。

14、為什么Thread類的sleep()和yield()方法是靜態的?

Thread類的sleep()和yield()方法將在當前正在執行的線程上運行。所以在其他處于等待狀態的線程上調用這些方法是沒有意義的。這就是為什么這些方法是靜態的。它們可以在當前正在執行的線程中工作,并避免程序員錯誤的認為可以在其他非運行線程調用這些方法。

15、如何保證線程安全?

在java中可以有很多方法來保證線程安全--同步,使用原子類(automic concurrent classes),實現并發鎖,使用volatile關鍵字,使用不變類和線程安全類。

16、volatile關鍵字在java中有什么作用?

當我們使用volatile關鍵字去修飾變量的時候,所有線程都會直接讀取該變量并且不緩存它。這就是確保了線程讀取到的變量是同內存中是一致的。

17、同步方法和同步塊,哪個是更好的選擇?

同步塊是更好的選擇,因為它不會鎖住整個對象(當然你也可以讓它鎖住整個對象)。同步方法會鎖住整個對象,哪怕這個類中有多個不相關聯的同步塊,這通常會導致他們停止執行并需要等待獲得這個對象上的鎖。

18、如何創建守護進程?

使用Thread類的setDaemon(true)方法可以將線程設置為守護線程,需要注意的是,需要在調用start()方法前調用這個方法,否則會拋出IllegalThreadStateException異常。

19、什么是ThreadLocal?

ThreadLocal用于創建線程的本地變量,我們知道一個對象的所有線程會共享它的全局變量,所以這些變量不是線程安全的,我們可以使用同步技術。但是當我們不想使用同步的時候,我們可以選擇ThreadLocal變量。

每個線程都會擁有他們自己的Thread變量,它們可以使用get(),set()方法去獲取他們的默認值或者在線程內部改變它們的值。ThreadLocal實例通常是希望它們同線程狀態關聯起來是private static屬性。

20、什么是Thread Group?為什么建議使用它?

ThreadGroup是一個類,它的目的是提供關于線程組的信息。

ThreadGroup API比較薄弱,它并沒有比Thread提供了更多的功能。它有兩個主要的功能:一是獲取線程組中處于活躍狀態線程的列表;二是設置為線程設置未捕獲異常處理器(ncaught exception handler)。但在java 1.5中Thread類也增加了setUncaughtExceptionHandler(UncaughtExceptionHandler eh)方法,所以ThreadGroup是已經過時的,不建議繼續使用。

t1.setUncaughtExceptionHandler(new UncaughtExceptionHandler(){

???????? @Override

???????? public void uncaughtException(Thread t,Throwable e){

???????? System.out.println(“exception occurred:”+e.getMessage());

}

});

21、什么是java線程轉儲(Thread Dump),如何得到它?

線程轉儲是一個JVM活動線程的列表,它對于分析系統瓶頸和死鎖非常有用。有很多方法可以獲取線程轉儲—使用Profiler,Kill -3命令,jstack工具等等。我更喜歡jstack工具,因為它容易使用并且是JDK自帶的。由于它是一個基于終端的工具,所以我們可以編寫一些腳本去定時的產生線程轉儲以待分析。

22、什么是死鎖(Deadlock)?如何分析和避免死鎖?

死鎖是指兩個以上的線程永遠阻塞的情況,這種情況產生至少需要兩個以上的線程和兩個以上的資源。

分析死鎖,我們需要查看java應用程序的線程轉儲。我們需要找出那些狀態為BLOCKED的線程和他們等待的資源。每個資源都有一個唯一的id,用這個id我們可以找出哪些線程已經擁有了它的對象鎖。

避免嵌套鎖,只在需要的地方使用鎖和避免無限期等待是死鎖避免的通常辦法,去學習如何分析死鎖。

23、什么是java Timer類?如何創建一個有特定時間間隔的任務?

java.util.Timer是一個工具類,可以用于安排一個線程在未來的某個特定時間執行。Timer類可以用安排一次性任務或者周期任務。

java.util.TimerTask是一個實現了Runnable接口的抽象類,我們需要取繼承這個類來創建我們自己的定時任務并使用Timer去安排它的執行。

24、什么是線程池?如何創建一個java線程池?

一個線程池管理了一組工作線程,同時,它還包括了一個用于放置等待執行的任務的隊列。

java.util.concurrent.Executors提供了一個java.util.concurrent.Executor接口的實現用于創建線程池。線程池例子展現了如何創建和使用線程池,或者ScheduledThreadPoolExecutor例子,了解如何創建一個周期任務。

?

https://blog.csdn.net/xingfei_work/article/details/79637488

轉載于:https://www.cnblogs.com/arrows/p/10346428.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537010.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537010.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537010.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JDK8那些驚為天人的新特性

分享一波:程序員賺外快-必看的巔峰干貨 介紹 隨著java的發展&#xff0c;越來越多的企業開始使用 java8 版本。Java8 是自 java5之后最重要的版本&#xff0c;這個版本包含語言、編譯器、庫、工具、JVM等方面的十多個新特性。本次課程將著重學習其中的一些重點特性。 Jdk8新…

mount 安卓system只讀_Android如何讓system分區可讀寫(MTK安卓6.0)-阿里云開發者社區...

Android 系統默認情況下&#xff0c;system 分區是只讀 mount 的&#xff0c;因為無法進行往里寫數據的&#xff0c;可以用 adb 命令 adb remount 重新 mount 一下。也可以通過在板子上&#xff0c;輸入以下命令重新mount一下system分區命令使其可讀可寫。# mount -o remount /…

【數據結構和算法05】 紅-黑樹(轉發)

2019獨角獸企業重金招聘Python工程師標準>>> 【數據結構和算法05】 紅-黑樹&#xff08;看完包懂~&#xff09; 置頂 2016年04月13日 15:50:25 eson_15 閱讀數&#xff1a;52681 標簽&#xff1a; java數據結構算法紅黑樹 更多 個人分類&#xff1a; ● 結構算法---…

數據結構與算法——二叉樹、堆、優先隊列

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 七、樹 7.1 樹 7.1.1 樹的定義 樹是我們計算機中非常重要的一種數據結構&#xff0c;同時使用樹這種數據結構&#xff0c;可以描述現實生活…

android組建之間通信_Android組件化(三)組件之間的通信

介紹在組件化開發的時候&#xff0c;組件之間是相互獨立的沒有依賴關系&#xff0c;我們不能在使用顯示調用來跳轉頁面了&#xff0c;因為我們組件化的目的之一就是解決模塊間的強依賴問題&#xff0c;假如現在要從A業務組件跳轉到業務B組件&#xff0c;并且要攜帶參數跳轉&…

繼牛津大學后,加大伯克利分校等多家美國高校終止與華為合作

文&#xff0f;AI財經社 唐煜編&#xff0f;嵇國華據 Nature News 報道&#xff0c;在美國相關部門的壓力之下&#xff0c;加州大學伯克利分校&#xff08;UC Berkeley&#xff09;近日宣布不再與華為簽署新的研究合作&#xff1b;德州大學奧斯丁分校也正在審查自身與華為的關系…

為什么varchar字段長度最好是2的n次方-1

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 計算機是二進制計算的&#xff0c;1 bytes 8 bit ,一個字節最多可以代表的數據長度是2的8次方 11111111 在計算機中也就是-128到127。 而var…

運籌學狀態轉移方程例子_強化學習第4期:H-J-B方程

在上一篇文章中&#xff0c;我們介紹了一種最簡單的MDP——s與a都是有限的MDP的求解方法。其中&#xff0c;我們用到了動態規劃的思想&#xff0c;并且推出了“策略迭代”、“值迭代”這樣的方法。今天&#xff0c;我們要來講更加一般的最優控制問題——t、a與s都是連續的問題。…

Python之celery的簡介與使用

celery的簡介 celery是一個基于分布式消息傳輸的異步任務隊列&#xff0c;它專注于實時處理&#xff0c;同時也支持任務調度。它的執行單元為任務&#xff08;task&#xff09;&#xff0c;利用多線程&#xff0c;如Eventlet&#xff0c;gevent等&#xff0c;它們能被并發地執行…

不使用比較運算符如何比較兩個數的大小

分享一波:程序員賺外快-必看的巔峰干貨 前言 今天在水群的過程中看到有位群員談論到這個話題&#xff0c;是他找工作過程中某家公司的面試題&#xff08;到底是哪家公司才會出這種沒營養的題目刁難別人&#xff09;&#xff0c;有點興趣&#xff0c;就開始寫了。 開搞 想了一…

java占位符填充_Java使用freemark生成word

1、制作模板先用office word做一個模板word文檔&#xff0c;${usrName}、${nowDate}占位符 可以使用 office 或者 wps 先創建一個模板表格 &#xff08;替換$部分可以在 模板格式改變之后 在替換xml 格式改了后有些原本的字符會分開&#xff09;2、用office word將模板word另存…

Java中如何使用非阻塞異步編程——CompletableFuture

分享一波:程序員賺外快-必看的巔峰干貨 對于Node開發者來說&#xff0c;非阻塞異步編程是他們引以為傲的地方。而在JDK8中&#xff0c;也引入了非阻塞異步編程的概念。所謂非阻塞異步編程&#xff0c;就是一種不需要等待返回結果的多線程的回調方法的封裝。使用非阻塞異步編程…

城市運行一網統管_【宣傳活動】持續開展城市運行“一網統管”建設宣傳活動...

為進一步推進本鎮城市運行“一網統管”建設工作&#xff0c;提高城市治理能力和治理水平&#xff0c;提升社會各界的知曉度和參與度&#xff0c;激發職能部門人員、黨員、群眾參與“一網統管”工作的熱情。9月10日&#xff0c;鎮網格中心于福泉居委會議室開展“推進城市運行‘一…

Java如何只使用位運算實現加減乘除

分享一波:程序員賺外快-必看的巔峰干貨 前言 接前面一篇博客&#xff0c;這又是某個公司的奇葩面試題&#xff08;都說了到底是哪家公司才會出這種沒營養的面試題&#xff09;。不過吐槽歸吐槽&#xff0c;這個題目還是有點學問的&#xff0c;比前面那個 不使用比較運算符如何…

Netweaver里某個software component和C4C的版本

有同事問如何通過代碼的方式獲得Netweaver里某個Software component的版本信息&#xff0c;以及Cloud for Customer&#xff08;C4C&#xff09;的版本信息。 Netweaver 點了Detail按鈕后&#xff1a; 這些版本信息存在表CVERS里&#xff1a; C4C C4C的版本號在Help->About …

pmc訂單表格_復工了,讀一則“如何提升訂單準交率和生產效率”的真實故事

故事發生在中國南方小鎮上一個做辦公家具的公司……家具公司創建于1995年&#xff0c;是一家集研發、生產、銷售、服務為一體的現代辦公家具、酒店家具制造企業。主要產品有實木班臺系列、會議臺系列、職員桌系列、屏風系列、沙發系列、辦公座椅、酒店家具系列。在省外還有兩個…

GET和POST請求到底有什么區別?

分享一波:程序員賺外快-必看的巔峰干貨 看到這個標題&#xff0c;想必大部分人都已經想關掉這篇博客了。先別急&#xff0c;你真的知道這兩個的區別嗎&#xff1f; 做過WEB開發的朋友可能很熟悉&#xff0c;看到這個問題能立馬脫口而出二者的區別。 GET在瀏覽器回退時是無害的…

有贊電商云應用框架設計

背景 有贊是 SaaS 公司&#xff0c;向商家提供了全方位的軟件服務&#xff0c;支撐商家進行采購、店鋪、商品、營銷、訂單、物流等等管理服務。 在這個軟件服務里&#xff0c;能夠滿足大部分的商家&#xff0c;為商家保駕護航。 但是很多大商家往往會有自己的特殊需求&#xff…

vivado 如何創建工程模式_基于Vivado的FPGA高性能開發研修班2019年8月30日上海舉行...

一、課程介紹&#xff1a;從7系列FPGA開始&#xff0c;Xilinx提出了Vivado Design Suite設計軟件&#xff0c;提供全新構建的SoC 增強型、以 IP 和系統為中心的下一代開發環境&#xff0c;以解決系統級集成和實現的生產力瓶頸。同時&#xff0c;Xilinx專門針對Vivado推出了Ultr…

程序員的自我修養——遠離“外包思維”

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 在我們做開發的日子里&#xff0c;不免會進行跳槽&#xff0c;跳來跳去公司無非就分成兩大類——互聯網公司、外包公司。當然我們本次討論的并…