java并發(fā)編程
1、什么叫線程乏奥?
一個(gè)程序執(zhí)行多個(gè)任務(wù)摆舟,通常每一個(gè)任務(wù)成為一個(gè)線程〉肆耍可以同時(shí)運(yùn)行一個(gè)以上線程的程序稱(chēng)為多線程程序恨诱。
線程與進(jìn)程的區(qū)別:
本質(zhì)區(qū)別在于進(jìn)程擁有自己的一整套變量,而線程則共享數(shù)據(jù)骗炉。
與進(jìn)程相比照宝,線程更加輕量級(jí),創(chuàng)建和銷(xiāo)毀一個(gè)線程的開(kāi)銷(xiāo)比進(jìn)程小很多句葵。
線程可能會(huì)不安全厕鹃。
實(shí)際應(yīng)用舉例:一個(gè)web服務(wù)可能要并發(fā)處理多個(gè)請(qǐng)求。一個(gè)瀏覽器可以同時(shí)下載多個(gè)幾幅圖片乍丈。
javase 1.5后多線程發(fā)生了重大變化剂碴,增加很多接口和類(lèi)。
2轻专、線程的創(chuàng)建方法:
1汗茄、實(shí)現(xiàn)Runnable接口。
2铭若、繼承Thread類(lèi)。
注意:不要調(diào)用Thread類(lèi)或Runnable接口的run方法递览。因?yàn)橹苯诱{(diào)用run方法叼屠,只會(huì)執(zhí)行同一個(gè)線程中的任務(wù),而不會(huì)啟動(dòng)線程绞铃。應(yīng)該調(diào)用Thread.start方法镜雨。這個(gè)方法將創(chuàng)建一個(gè)執(zhí)行run方法的新線程。
3儿捧、中斷線程
常用方法:
//向線程發(fā)送中斷請(qǐng)求荚坞,將線程中斷狀態(tài)標(biāo)記為true挑宠。如果目前該線程被一個(gè)sleep調(diào)用阻塞,將拋出InterruptedException 異常颓影。
void interrupt(){}
//靜態(tài)方法各淀,判斷當(dāng)前線程是否被中斷,會(huì)將線程的中斷狀態(tài)標(biāo)記為false
static boolean interrupted(){}
//實(shí)例方法诡挂,判斷當(dāng)前線程是否被中斷
boolean isInterrupted(){}
//靜態(tài)方法碎浇,返回代表當(dāng)前執(zhí)行線程的Thread對(duì)象
static ThreadcurrentThread(){}
中斷線程的作用是為了實(shí)現(xiàn)多線程,在該線程中斷其他線程獲得運(yùn)行機(jī)會(huì)璃俗。
4奴璃、線程的幾種狀態(tài)
創(chuàng)建new,可運(yùn)行Runnable城豁,被阻塞Blocked苟穆,等待waiting,計(jì)時(shí)終止Timed waiting唱星,被終止Terminated
被阻塞和等待線程雳旅。
什么時(shí)候有可能變成阻塞狀態(tài)?
當(dāng)一個(gè)線程試圖獲取一個(gè)內(nèi)部的對(duì)象鎖魏颓,而該鎖被其他線程所擁有岭辣,則該線程進(jìn)入阻塞狀態(tài)。
當(dāng)線程等待另一個(gè)線程通知調(diào)度器一個(gè)條件時(shí)甸饱,它自己進(jìn)入阻塞狀態(tài)沦童。
有幾個(gè)方法有一個(gè)參數(shù)超時(shí),調(diào)用他們導(dǎo)致線程進(jìn)入計(jì)時(shí)等待叹话。
線程的終止:
run方法正常執(zhí)行退出而死亡偷遗。
因?yàn)橐粋€(gè)沒(méi)有捕獲的異常終止了run方法而意外死亡。
線程屬性:線程優(yōu)先級(jí)驼壶,守護(hù)線程氏豌,線程組
什么叫守護(hù)線程?
守護(hù)線程
setDaemon(Boolean f)守護(hù)線程的唯一作用就是為其他線程提供服務(wù)的热凹。
線程組是一個(gè)可以統(tǒng)一管理的線程的集合泵喘。默認(rèn)的情況下創(chuàng)建的所有的線程屬于相同的線程組。
對(duì)象鎖
同步的作用保證數(shù)據(jù)正確性和一致性般妙。兩個(gè)線程或兩個(gè)以上線程要共享對(duì)同一數(shù)據(jù)的存取纪铺。java語(yǔ)言提供了Synchronized關(guān)鍵字,并在1.5后引入了ReentrantLock碟渺。在執(zhí)行一段代碼前鲜锚,會(huì)給它加上對(duì)象鎖。別的同步線程如果要運(yùn)行,必須得等當(dāng)前線程運(yùn)行完芜繁,才能順利運(yùn)行旺隙。
同步方法和同步代碼塊的區(qū)別:
同步方法是粗粒度的:
即有synchronized關(guān)鍵字修飾的方法。?
由于java的每個(gè)對(duì)象都有一個(gè)內(nèi)置鎖骏令,當(dāng)用此關(guān)鍵字修飾方法時(shí)蔬捷,?
內(nèi)置鎖會(huì)保護(hù)整個(gè)方法。在調(diào)用該方法前伏社,需要獲得內(nèi)置鎖抠刺,否則就處于阻塞狀態(tài)。
同步代碼塊是細(xì)粒度的:
即Synchronized關(guān)鍵字修飾的代碼塊摘昌。
被該關(guān)鍵字修飾的語(yǔ)句塊會(huì)自動(dòng)被加上內(nèi)置鎖速妖,從而實(shí)現(xiàn)同步。
條件對(duì)象
條件對(duì)象個(gè)人的理解是為了實(shí)現(xiàn)某些特定條件下同步聪黎,而做出的努力罕容。通過(guò)別的線程的一些狀態(tài)變化,來(lái)滿(mǎn)足本線程的條件稿饰,從而繼續(xù)運(yùn)行本線程锦秒。