摘要:和方法用來設(shè)置線程是否成為守護線程和判斷線程是否是守護線程。守護線程依賴于創(chuàng)建它的線程,隨它的消亡而消亡。使用提供的方法,提醒線程終止,但是否真正終止由線程自己決定。參考實戰(zhàn)高并發(fā)程序設(shè)計多線程干貨系列一多線程基礎(chǔ)
一、如何創(chuàng)建多線程 1、繼承Thread類
public class MyThread extends Thread { @Override public void run() { super.run(); System.out.println("MyThread"); } } public class Run { public static void main(String [] args){ MyThread thread = new MyThread(); thread.start(); } }
這里需要注意的是,run()方法里寫的是線程執(zhí)行的動作,而start()是創(chuàng)建線程并運行。
2、實現(xiàn)Runable接口public class MyRunnable implements Runnable{ private int num; public MyRunnable(){ num++; } @Override public void run(){ System.out.println("It"s the " + num + " Thread"); } } public class Run { public static void main(String [] args){ MyRunnable runnable = new MyRunnable(); Thread thread = new Thread(runnable); thread.start(); System.out.println("運行結(jié)束"); } }二、線程的狀態(tài)
https://user-gold-cdn.xitu.io...
三、上下文切換在一個核運行線程時,如果當前線程需要暫停轉(zhuǎn)去運行其他線程,這個行為就叫做上下文切換。
但是某個線程暫停轉(zhuǎn)去運行其他線程后,要恢復(fù)這個線程時,需要從上次暫停的地方繼續(xù)執(zhí)行,這就需要CPU記錄一些數(shù)據(jù)來幫助恢復(fù)。(比如程序計數(shù)器,CPU寄存器等等)
因此可以說,上下文切換就是存儲和恢復(fù)CPU狀態(tài)的,能夠使線程從斷點繼續(xù)執(zhí)行。
https://user-gold-cdn.xitu.io...
1、類方法(1)sleep()方法
這個方法是讓線程暫停(休眠)一段時間。
sleep(long millis) //參數(shù)為毫秒 sleep(long millis,int nanoseconds) //第一參數(shù)為毫秒,第二個參數(shù)為納秒
調(diào)用了sleep()方法,被休眠的線程會讓出CPU給其他線程,但是需要注意的是,它不會讓出鎖,也就是說線程雖然休眠了,但是依舊保持本來有的鎖。
另外,當休眠時間結(jié)束之后,并不一定會立即執(zhí)行,因為此時可能還有其他線程在執(zhí)行。
(2)yield()方法
yield()與sleep()方法類似,同樣讓出CPU,不讓出對象鎖。但是不同點在于,yield不會傳入?yún)?shù),并且調(diào)用yield后,線程會進入就緒狀態(tài),隨時等待重新獲得CPU時間片。而調(diào)用sleep后,線程會進入阻塞狀態(tài)。
并且,yield方法只允許和當前線程擁有相同優(yōu)先級的線程獲取CPU。
2、對象方法(1)isAlive()方法
判斷當前線程是否活躍?;钴S是指線程處于就緒或者運行的狀態(tài)。
(2)join()方法
如果一個主線程啟動了一個子線程,并且希望子線程執(zhí)行完畢后再結(jié)束,那么就可以調(diào)用join()方法,即等待線程對象銷毀。
(3)setDaemon和isDaemon方法
用來設(shè)置線程是否成為守護線程和判斷線程是否是守護線程。
守護線程依賴于創(chuàng)建它的線程,隨它的消亡而消亡。
https://user-gold-cdn.xitu.io...
3、其他方法(1)線程的停止
停止線程一般有三種方法:
① 調(diào)用stop()函數(shù),這個方法實際上已經(jīng)廢棄了,因為它會立即終止線程,并且會釋放所有的鎖,因此可能會造成不可預(yù)期的結(jié)果。
② 自定義一個變量,當這個變量發(fā)生改變時,提醒線程終止。
③ 使用JDK提供的interrupt方法,提醒線程終止,但是否真正終止由線程自己決定。
(注意:線程在休眠時中斷,會拋出異常,此時只能通過interrupt方法)
(2)wait和notify方法
這兩個方法是Object類的方法,也就是說對所有對象都可以調(diào)用。
調(diào)用了wait方法,線程就會停止執(zhí)行,進入一個隊列中,等待notify方法去喚醒,但是notify方法只會隨機喚醒一個線程,而notifyAll可以喚醒所有線程。
需要注意的是wait會釋放鎖,這是與sleep的不同之處。
參考:《實戰(zhàn)Java高并發(fā)程序設(shè)計》
Java 多線程干貨系列—(一)Java 多線程基礎(chǔ) https://juejin.im/post/5907bb...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75146.html
摘要:我的學(xué)習(xí)筆記匯總標簽筆記分為兩大部分和筆記內(nèi)容主要是對一些基礎(chǔ)特性和編程細節(jié)進行總結(jié)整理,適合了解基礎(chǔ)語法,想進一步深入學(xué)習(xí)的人如果覺得不錯,請給,這也是對我的鼓勵,有什么意見歡迎留言反饋目錄基礎(chǔ)鞏固筆記反射基礎(chǔ)鞏固筆記泛型基礎(chǔ)鞏 我的java&javaweb學(xué)習(xí)筆記(匯總) 標簽: java [TOC] 筆記分為兩大部分:javase和javaweb javase javawe...
摘要:并沒有對方法進行加同步鎖,所以是非線程安全的。相同情況下使用相比使用僅能獲得左右的性能提升,但卻要冒多線程不安全的風(fēng)險。水池異常表示程序可以處理的異常,可以捕獲且可能恢復(fù)。 一、String, StringBuffer, StringBuilder 1、可變性 (1)String類型是使用一個final修飾的字符數(shù)組,因此它是不可變的。 private final char value...
摘要:系統(tǒng)級線程核心級線程由操作系統(tǒng)內(nèi)核進行管理。值得注意的是多線程的存在,不是提高程序的執(zhí)行速度。實現(xiàn)多線程上面說了一大堆基礎(chǔ),理解完的話。虛擬機的啟動是單線程的還是多線程的是多線程的。 前言 之前花了一個星期回顧了Java集合: Collection總覽 List集合就這么簡單【源碼剖析】 Map集合、散列表、紅黑樹介紹 HashMap就是這么簡單【源碼剖析】 LinkedHashMa...
摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號作者架構(gòu)師奮斗者掃描主頁左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進步歡迎點贊收藏留言前情提要無意間聽到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...
閱讀 1411·2021-11-22 09:34
閱讀 2609·2021-11-12 10:36
閱讀 1147·2021-11-11 16:55
閱讀 2360·2020-06-22 14:43
閱讀 1489·2019-08-30 15:55
閱讀 2006·2019-08-30 15:53
閱讀 1788·2019-08-30 10:50
閱讀 1246·2019-08-29 12:15