java list pair_JavaList
說明進(jìn)程和線程的區(qū)別 *****
1)從操作系統(tǒng)層面看,進(jìn)程是應(yīng)用程序的一個(gè)運(yùn)行活動(dòng)過程,是操作系統(tǒng)資源管理的實(shí)體。進(jìn)程是操作系統(tǒng)分配和調(diào)度系統(tǒng)內(nèi)存、CPU時(shí)間片等資源的基本單位,為正在運(yùn)行的應(yīng)用程序提供運(yùn)行環(huán)境。一個(gè)進(jìn)程至少包括一個(gè)線程。每個(gè)進(jìn)程都有自己獨(dú)立的內(nèi)存地址空間。
2)線程是進(jìn)程內(nèi)部執(zhí)行代碼的實(shí)體,它是CPU調(diào)度資源的最小單元,一個(gè)進(jìn)程內(nèi)部可以有多個(gè)線程并發(fā)運(yùn)行。線程沒有自己獨(dú)立的內(nèi)存資源,它只有自己的執(zhí)行堆棧和局部變量,所以線程不能獨(dú)立地執(zhí)行,它必須依附在一個(gè)進(jìn)程上。在同一個(gè)進(jìn)程內(nèi)多個(gè)線程之間可以共享進(jìn)程的內(nèi)存資源。
如何創(chuàng)建一個(gè)線程
可以直接調(diào)用Thread類的run()方法嗎?
什么是線程調(diào)度器(Thread Scheduler)和時(shí)間分片(Time Slicing)?
線程調(diào)度器是一個(gè)操作系統(tǒng)服務(wù),它負(fù)責(zé)為Runnable狀態(tài)的線程分配CPU時(shí)間。一旦我們創(chuàng)建一個(gè)線程并啟動(dòng)它,它的執(zhí)行便依賴于線程調(diào)度器的實(shí)現(xiàn)。時(shí)間分片是指將可用的CPU時(shí)間分配給可用的Runnable線程的過程。分配CPU時(shí)間可以基于線程優(yōu)先級(jí)或者線程等待的時(shí)間。線程調(diào)度并不受到Java虛擬機(jī)控制,所以由應(yīng)用程序來控制它是更好的選擇(也就是說不要讓你的程序依賴于線程的優(yōu)先級(jí))。
說明線程的狀態(tài) *****
1)新狀態(tài)
2)可運(yùn)行狀態(tài)
3)運(yùn)行狀態(tài)
4)等待/阻塞/睡眠狀態(tài)
5)死亡狀態(tài)
線程之間是如何通信的?
當(dāng)線程間是可以共享資源時(shí),線程間通信是協(xié)調(diào)它們的重要的手段。Object類中wait()\notify()\notifyAll()方法可以用于線程間通信關(guān)于資源的鎖的狀態(tài)。
說明 wait() 和 notify() 的作用和用法,并做代碼演示 *****
說明 notifyAll() 的用法,并做代碼演示 ****
為什么線程通信的方法wait(), notify()和notifyAll()被定義在Object類里?
Java的每個(gè)對(duì)象中都有一個(gè)鎖(monitor,也可以成為監(jiān)視器) 并且wait(),notify()等方法用于等待對(duì)象的鎖或者通知其他線程對(duì)象的監(jiān)視器可用。在Java的線程中并沒有可供任何對(duì)象使用的鎖和同步器。這就是為什么這些方法是Object類的一部分,這樣Java的每一個(gè)類都有用于線程間通信的基本方法
為什么wait(), notify()和notifyAll()必須在同步方法或者同步塊中被調(diào)用?
當(dāng)一個(gè)線程需要調(diào)用對(duì)象的wait()方法的時(shí)候,這個(gè)線程必須擁有該對(duì)象的鎖,接著它就會(huì)釋放這個(gè)對(duì)象鎖并進(jìn)入等待狀態(tài)直到其他線程調(diào)用這個(gè)對(duì)象上的notify()方法。同樣的,當(dāng)一個(gè)線程需要調(diào)用對(duì)象的notify()方法時(shí),它會(huì)釋放這個(gè)對(duì)象的鎖,以便其他在等待的線程就可以得到這個(gè)對(duì)象鎖。由于所有的這些方法都需要線程持有對(duì)象的鎖,這樣就只能通過同步來實(shí)現(xiàn),所以他們只能在同步方法或者同步塊中被調(diào)用。
為什么Thread類的sleep()和yield()方法是靜態(tài)的?
Thread類的sleep()和yield()方法將在當(dāng)前正在執(zhí)行的線程上運(yùn)行。所以在其他處于等待狀態(tài)的線程上調(diào)用這些方法是沒有意義的。這就是為什么這些方法是靜態(tài)的。它們可以在當(dāng)前正在執(zhí)行的線程中工作,并避免程序員錯(cuò)誤的認(rèn)為可以在其他非運(yùn)行線程調(diào)用這些方法。
wait() 和 sleep() 有什么區(qū)別
最大的不同是在等待時(shí)wait會(huì)釋放鎖,而sleep一直持有鎖。Wait通常被用于線程間交互,sleep通常被用于暫停執(zhí)行。
說明線程合并的含義和實(shí)現(xiàn)方式
說明守護(hù)線程的生命周期和使用場(chǎng)景
用戶線程和守護(hù)線程有什么區(qū)別
Java中用到的線程調(diào)度算法是什么?
在Java中什么是線程調(diào)度?
在線程中你怎么處理不可捕捉異常?
什么是ThreadLocal?
ThreadLocal用于創(chuàng)建線程的本地變量,我們知道一個(gè)對(duì)象的所有線程會(huì)共享它的全局變量,所以這些變量不是線程安全的,我們可以使用同步技術(shù)。但是當(dāng)我們不想使用同步的時(shí)候,我們可以選擇ThreadLocal變量。
每個(gè)線程都會(huì)擁有他們自己的Thread變量,它們可以使用get()\set()方法去獲取他們的默認(rèn)值或者在線程內(nèi)部改變他們的值。ThreadLocal實(shí)例通常是希望它們同線程狀態(tài)關(guān)聯(lián)起來是private static屬性。在ThreadLocal例子這篇文章中你可以看到一個(gè)關(guān)于ThreadLocal的小程序。
什么是線程組,為什么Java中不推薦使用?
ThreadGroup是一個(gè)類,它的目的是提供關(guān)于線程組的信息。
ThreadGroup API比較薄弱,它并沒有比Thread提供了更多的功能。它有兩個(gè)主要的功能:一是獲取線程組中處于活躍狀態(tài)線程的列表;二是設(shè)置為線程設(shè)置未捕獲異常處理器(ncaught exception handler)。但在Java 1.5中Thread類也添加了setUncaughtExceptionHandler(UncaughtExceptionHandler eh) 方法,所以ThreadGroup是已經(jīng)過時(shí)的,不建議繼續(xù)使用。
什么是Java線程轉(zhuǎn)儲(chǔ)(Thread Dump),如何得到它?
線程轉(zhuǎn)儲(chǔ)是一個(gè)JVM活動(dòng)線程的列表,它對(duì)于分析系統(tǒng)瓶頸和死鎖非常有用。有很多方法可以獲取線程轉(zhuǎn)儲(chǔ)——使用Profiler,Kill -3命令,jstack工具等等。我更喜歡jstack工具,因?yàn)樗菀资褂貌⑶沂荍DK自帶的。由于它是一個(gè)基于終端的工具,所以我們可以編寫一些腳本去定時(shí)的產(chǎn)生線程轉(zhuǎn)儲(chǔ)以待分析。
什么是原子操作?并發(fā)包中的原子類(atomic classes)有什么作用?
原子操作是指一個(gè)不受其他操作影響的操作任務(wù)單元。原子操作是在多線程環(huán)境下避免數(shù)據(jù)不一致必須的手段。
int++并不是一個(gè)原子操作,所以當(dāng)一個(gè)線程讀取它的值并加1時(shí),另外一個(gè)線程有可能會(huì)讀到之前的值,這就會(huì)引發(fā)錯(cuò)誤。
為了解決這個(gè)問題,必須保證增加操作是原子的,在JDK1.5之前我們可以使用同步技術(shù)來做到這一點(diǎn)。到JDK1.5,java.util.concurrent.atomic包提供了int和long類型的裝類,它們可以自動(dòng)的保證對(duì)于他們的操作是原子的并且不需要使用同步。
Java Concurrency API中的Lock接口(Lock interface)是什么?對(duì)比同步它有什么優(yōu)勢(shì)?
Lock接口比同步方法和同步塊提供了更具擴(kuò)展性的鎖操作。他們?cè)试S更靈活的結(jié)構(gòu),可以具有完全不同的性質(zhì),并且可以支持多個(gè)相關(guān)類的條件對(duì)象。
它的優(yōu)勢(shì)有:
可以使鎖更公平 可以使線程在等待鎖的時(shí)候響應(yīng)中斷 可以讓線程嘗試獲取鎖,并在無法獲取鎖的時(shí)候立即返回或者等待一段時(shí)間 可以在不同的范圍,以不同的順序獲取和釋放鎖
什么是Executors框架?
Executor框架同java.util.concurrent.Executor 接口在Java 5中被引入。Executor框架是一個(gè)根據(jù)一組執(zhí)行策略調(diào)用,調(diào)度,執(zhí)行和控制的異步任務(wù)的框架。
無限制的創(chuàng)建線程會(huì)引起應(yīng)用程序內(nèi)存溢出。所以創(chuàng)建一個(gè)線程池是個(gè)更好的的解決方案,因?yàn)榭梢韵拗凭€程的數(shù)量并且可以回收再利用這些線程。利用Executors框架可以非常方便的創(chuàng)建一個(gè)線程池
在Java中Executor和Executors的區(qū)別?
為什么使用Executor框架比使用應(yīng)用創(chuàng)建和管理線程好?
什么是阻塞隊(duì)列?如何使用阻塞隊(duì)列來實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模型?
java.util.concurrent.BlockingQueue的特性是:當(dāng)隊(duì)列是空的時(shí),從隊(duì)列中獲取或刪除元素的操作將會(huì)被阻塞,或者當(dāng)隊(duì)列是滿時(shí),往隊(duì)列里添加元素的操作會(huì)被阻塞。
阻塞隊(duì)列不接受空值,當(dāng)你嘗試向隊(duì)列中添加空值的時(shí)候,它會(huì)拋出NullPointerException。
阻塞隊(duì)列的實(shí)現(xiàn)都是線程安全的,所有的查詢方法都是原子的并且使用了內(nèi)部鎖或者其他形式的并發(fā)控制。
BlockingQueue 接口是java collections框架的一部分,它主要用于實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者問題。
什么是Callable和Future?
Java5在concurrency包中引入了java.util.concurrent.Callable 接口,它和Runnable接口很相似,但它可以返回一個(gè)對(duì)象或者拋出一個(gè)異常。
Callable接口使用泛型去定義它的返回類型。Executors類提供了一些有用的方法去在線程池中執(zhí)行Callable內(nèi)的任務(wù)。由于Callable任務(wù)是并行的,我們必須等待它返回的結(jié)果。java.util.concurrent.Future對(duì)象為我們解決了這個(gè)問題。在線程池提交Callable任務(wù)后返回了一個(gè)Future對(duì)象,使用它我們可以知道Callable任務(wù)的狀態(tài)和得到Callable返回的執(zhí)行結(jié)果。Future提供了get()方法讓我們可以等待Callable結(jié)束并獲取它的執(zhí)行結(jié)果。
什么是FutureTask?
FutureTask是Future的一個(gè)基礎(chǔ)實(shí)現(xiàn),我們可以將它同Executors使用處理異步任務(wù)。通常我們不需要使用FutureTask類,單當(dāng)我們打算重寫Future接口的一些方法并保持原來基礎(chǔ)的實(shí)現(xiàn)是,它就變得非常有用。我們可以僅僅繼承于它并重寫我們需要的方法。閱讀Java FutureTask例子,學(xué)習(xí)如何使用它。
什么是并發(fā)容器的實(shí)現(xiàn)?
Java集合類都是快速失敗的,這就意味著當(dāng)集合被改變且一個(gè)線程在使用迭代器遍歷集合的時(shí)候,迭代器的next()方法將拋出ConcurrentModificationException異常。
并發(fā)容器支持并發(fā)的遍歷和并發(fā)的更新。
主要的類有ConcurrentHashMap, CopyOnWriteArrayList 和CopyOnWriteArraySet,閱讀這篇文章了解如何避免ConcurrentModificationException。
Executors類是什么?
Executors為Executor,ExecutorService,ScheduledExecutorService,ThreadFactory和Callable類提供了一些工具方法。
Executors可以用于方便的創(chuàng)建線程池。
自定義線程池的實(shí)現(xiàn)
怎樣方便地獲取線程執(zhí)行完畢后的結(jié)果
總結(jié)
以上是生活随笔為你收集整理的java list pair_JavaList的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java venus_来认识一下venu
- 下一篇: java日期类的计算问题_java日期计