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