第7章多線程
7.1什么是進(jìn)程?什么是線程?進(jìn)程與線程的關(guān)系是怎樣的?
【答】進(jìn)程:進(jìn)程是一個(gè)可并發(fā)的具有獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次執(zhí)行過(guò)程,也是操作系統(tǒng)進(jìn)行資源分配和保護(hù)的基本單位。
線程:線程是操作系統(tǒng)進(jìn)程中能夠獨(dú)立執(zhí)行的實(shí)體,是處理器調(diào)度和分派的基本單位。線程是進(jìn)程的組成部分,每個(gè)進(jìn)程內(nèi)允許包含多個(gè)并發(fā)執(zhí)行的線程。
7.2操作系統(tǒng)為什么要支持多線程技術(shù)?
【答】操作系統(tǒng)采用進(jìn)程機(jī)制能夠減少程序并發(fā)時(shí)所付出的時(shí)空開(kāi)銷,使得并發(fā)粒度更細(xì),并發(fā)性更好,提高了資源使用率和系統(tǒng)效率。
7.3Java為什么要支持線程?什么場(chǎng)合需要使用多線程程序設(shè)計(jì)?
【答】支持多線程能充分發(fā)揮硬件的并發(fā)性,消除處理器和I/O設(shè)備的互等現(xiàn)象,提高系統(tǒng)效率。一般一下場(chǎng)合需要使用多線程:
????1、程序包好復(fù)雜的計(jì)算任務(wù)時(shí),主要是利用多線程獲取更所得CPU時(shí)間。
????2、處理速度較慢的外圍設(shè)備。
????3、程序設(shè)計(jì)自身的需要。
7.4Java提供了哪些接口和類實(shí)現(xiàn)多線程機(jī)制?
【答】Java主要提供了java.lang.Runnable接口和Thread線程類來(lái)實(shí)現(xiàn)多線程機(jī)制。
7.5一個(gè)線程對(duì)象的生命周期有哪幾種狀態(tài)構(gòu)成?各狀態(tài)之間是如何變化的?
【答】
線程對(duì)象的生命周期主要包括:新建態(tài)、就緒態(tài)和運(yùn)行態(tài)、阻塞態(tài)和等待態(tài)、終止態(tài)。新建態(tài)通過(guò)start()方法是線程成為運(yùn)行態(tài),當(dāng)運(yùn)行態(tài)遇到sleep()或wait()方法時(shí)就進(jìn)入等待態(tài),而當(dāng)sleep()時(shí)間到或通過(guò)notify()方法線程就又進(jìn)入了運(yùn)行態(tài);當(dāng)運(yùn)行態(tài)遇到synchronized()方法時(shí)就進(jìn)入阻塞態(tài),當(dāng)線程獲得互斥鎖使用權(quán)時(shí)就又到了運(yùn)行態(tài);當(dāng)線程的run()方法結(jié)束時(shí)整個(gè)線程就進(jìn)入了終止態(tài),整個(gè)線程結(jié)束。
7.6Java提供了哪些方法能夠改變線程狀態(tài)?程序中能夠調(diào)度線程立即執(zhí)行嗎?
【答】Java中提供了start()方法來(lái)啟動(dòng)已創(chuàng)建的線程對(duì)象;sleep()方法使當(dāng)前線程睡眠若干毫秒,線程有運(yùn)行態(tài)進(jìn)入等待態(tài),但是不交出臨界區(qū)的鎖;yield()方法暫停當(dāng)前線程的執(zhí)行,允許其他線程競(jìng)爭(zhēng)CPU;stop()方法來(lái)結(jié)束一個(gè)線程;wait()方法將本線程設(shè)為等待態(tài);notify()方法來(lái)喚醒當(dāng)前處于等待態(tài)的線程;interrupt()方法改變當(dāng)前線程的中斷狀態(tài),但是當(dāng)前線程還可以繼續(xù)執(zhí)行。
7.7什么是線程的優(yōu)先級(jí)?設(shè)置線程優(yōu)先級(jí)有什么作用?
【答】每個(gè)線程被執(zhí)行的優(yōu)先順序即為線程的優(yōu)先級(jí),默認(rèn)優(yōu)先級(jí)為5。當(dāng)創(chuàng)建了多個(gè)線程并要執(zhí)行這些線程時(shí),操作系統(tǒng)不知到底該執(zhí)行哪個(gè)線程,當(dāng)設(shè)置好優(yōu)先級(jí)后,程序首先會(huì)執(zhí)行優(yōu)先級(jí)最高的線程,然后依次執(zhí)行下去。這樣處理器將會(huì)合理而且充實(shí)的額被利用,不會(huì)造成資源的浪費(fèi)或者運(yùn)行的混亂。
7.8線程按什么規(guī)則排隊(duì)等待?
【答】線程按優(yōu)先級(jí)排隊(duì),線程調(diào)度語(yǔ)句優(yōu)先級(jí)基礎(chǔ)上的“先到先服務(wù)”原則
7.9多線程間共享數(shù)據(jù)時(shí)會(huì)發(fā)生怎樣的并發(fā)執(zhí)行錯(cuò)誤?
【答】當(dāng)幾個(gè)線程共享數(shù)據(jù)時(shí),一個(gè)線程的執(zhí)行可能影響其他線程的執(zhí)行結(jié)果,并導(dǎo)致錯(cuò)誤的程序運(yùn)行結(jié)果。
7.10在什么情況下需要采用線程同步機(jī)制?
【答】當(dāng)并發(fā)執(zhí)行的多個(gè)線程間需要共享資源或交換數(shù)據(jù)時(shí),各個(gè)線程執(zhí)行時(shí)相互之間會(huì)干擾或影響其他線程的執(zhí)行結(jié)果,這時(shí)就需要采用線程同步機(jī)制。
7.11關(guān)鍵字synchronized是什么含義?為什么wait()和notify()方法要與synchronized同時(shí)使用?
【答】synchronized用于聲明一段程序?yàn)榕R界區(qū),使線程對(duì)臨界資源采用互斥使用方式。
wait()和notify()不是屬于線程類,而是每一個(gè)對(duì)象都具有的方法,而且這兩個(gè)方法都和對(duì)象鎖有關(guān),有鎖的地方必有synchronized()方法,故wait()和notify()方法要與synchronized同時(shí)使用。
7.12明sleep()和wait()方法的異同。
【答】wait是Object類的方法,sleep與yield都是Thread類的方法。wait調(diào)用的時(shí)候需要注意的是該方法是釋放鎖標(biāo)志的,而sleep在調(diào)用的時(shí)候是緊緊抱著鎖標(biāo)志的,也就是等他完全執(zhí)行完成了才可以讓其他線程來(lái)訪問(wèn)的
sleep方法使當(dāng)前運(yùn)行中的線程睡眼一段時(shí)間,進(jìn)入不可運(yùn)行狀態(tài),這段時(shí)間的長(zhǎng)短是由程序設(shè)定的,yield方法使當(dāng)前線程讓出CPU占有權(quán),但讓出的時(shí)間是不可設(shè)定的。
7.13一個(gè)對(duì)象為什么需要調(diào)用wait()方法使當(dāng)前線程等待?
【答】wait()使當(dāng)前線程進(jìn)入停滯狀態(tài)時(shí),還會(huì)釋放當(dāng)前線程所占有的“鎖標(biāo)志”,從而使線程所在對(duì)象中的其它synchronized數(shù)據(jù)可被別的線程使用。當(dāng)調(diào)用sleep()方法時(shí),該線程不會(huì)釋放當(dāng)前線程所占有的“鎖標(biāo)志”。
7.14什么是死鎖?什么情況下會(huì)死鎖?
【答】由于資源占用是互斥的,當(dāng)某個(gè)進(jìn)程提出申請(qǐng)資源后,使得有關(guān)進(jìn)程在無(wú)外力協(xié)助下,永遠(yuǎn)分配不到必需的資源而無(wú)法繼續(xù)運(yùn)行,這就產(chǎn)生了一種特殊現(xiàn)象死鎖。
當(dāng)多個(gè)線程同時(shí)被阻塞,他們中的一個(gè)或者全部都在等待某個(gè)資源被釋放,由于線程被無(wú)限期地阻塞,因此程序處于非正常終止,才會(huì)產(chǎn)生死鎖。