線程進程的區(qū)別和聯系 怎么結束一個線程?
1、進程是資源分配的最小單位,線程是資源調度的最小單位。
2、線程是在進程下運行的。一個進程可以包含多個線程。
3、進程有自己的獨立地址空間,每啟動一個進程,系統就會為它分配地址空間。而線程是共享進程中的數據的,使用相同的地址空間。
4、同一進程下不同線程間數據容易共享,不同進程間數據很難共享。
5、線程之間沒有單獨的地址空間,一個線程死掉,整個進程也死掉。而一個進程死掉并不會對另外一個進程造成影響。
怎么結束一個線程?
一種:當run方法完成后線程終止
run方法中的內容執(zhí)行完后線程一般就自動結束了。
第二種:使用stop方法強行終止
該方法會強制關閉正在執(zhí)行的線程,這種方法是不推薦的,因為假如很多指令正在執(zhí)行,很多重要操作可能尚未完成,如果強制停止會導致潛在問題,例如一些清理性的工作沒完成,如文件,數據庫等的關閉。
也就說調用 stop() 方法會立即釋放該線程所持有的所有的鎖,導致數據得不到同步,出現數據不一致的問題。
第三種:通過發(fā)送信號來終止線程
其本質和開啟類似,就是主線程給子線程發(fā)送一個可以關閉的信號,但是具體什么時候執(zhí)行關閉由子線程決定。這就像你正在工作,女朋友突然打電話要你和她出去逛街,你說“稍等,我先將手上的工作完成”是一樣的道理。也就是說main線程只給子線程發(fā)送信號來告知要結束,而不是暴力地直接將其停掉。具體是否要關閉由子線程根據自身狀態(tài)決定是否停止。
那通過信號停止線程,具體工作是怎么樣的呢?應用程序發(fā)送一個線程終止的信號給JVM,JVM處理之后轉給操作系統,操作系統再轉給CPU,CPU收到之后會自行決定是否終止,而不一定馬上終止。CPU此時可能在執(zhí)行某個原子操作,或者要完成finally的功能才終止操作等,也就是會等手頭的工作完成再終止(也叫安全點 ,或者安全區(qū)域)。
在Java中,主要是通過interrupt和isInterruptted()。
在Thread中提供了一個interrupt()方法,從名字看表示中斷,但實際上并不像stop()方法一樣直接中斷線程,而是向子線程發(fā)送一個中斷的通知。例如,假如你是領導,對于在加班的同事,你會說”做完就下班吧,其他明天再說“。這就是你給他發(fā)的信號量,而不是強制讓他走,同事可以根據自己的情況處理完再走,這個時間可能是一分鐘,也可能是一小時,決定權在同事這里。這就是信號量的含義,也是線程安全中斷的基本模型。
與interrupt()相配合的就是isInterruptted(),功能是判斷是否收到了可以中斷的請求。例如有的人一下午就看著領導走沒走, 只要一走,立馬開溜,這就是一直在通過isInterruptted()監(jiān)聽是否可以中斷。