一、執行緒概念
程序是系統分配資源的最小單位,執行緒是系統排程的最小單位。乙個程序內的執行緒之間是可以共享資源的。每個程序至少有乙個執行緒存在,即主線程。
二、建立執行緒的主要方法
1、方法一:繼承thread類
可以通過繼承 thread 來建立乙個執行緒類,該方法的好處是 this 代表的就是當前執行緒,不需要通過 thread.currentthread() 來獲取當前執行緒的引用
public
class
threadtest3
}public
static
void
main
(string[
] args)
}
2、方法二:實現runnable 介面
通過實現 runnable 介面,並且呼叫 thread 的構造方法時將 runnable 物件作為 target 引數傳入來建立執行緒物件。 該方法的好處是可以規避類的單繼承的限制;但需要通過 thread.currentthread() 來獲取當前執行緒的引用。
public
class
threadtest21
}public
static
void
main
(string[
] args)
}
三、thread 類及其常見的方法
1、thread 類是 jvm 用來管理執行緒的乙個類,換句話說,每個執行緒都有乙個唯一的 thread 物件與之關聯。
2、常見的構造方法:
方法說明
thread()
建立執行緒物件
thread(runnable target)
使用runnable物件建立執行緒物件
thread(string name)
建立想成物件,並命名
thread(runnable target,string name)
使用runnable 物件建立執行緒物件,並命名
thread t1 = new thread();
thread t2 = new thread(new myrunnable());
thread t3 = new thread(「這是我的名字」);
thread t4 = new thread(new myrunnable(), 「這是我的名字」);
四、thread 幾個常見的屬性屬性
獲取方法
idgetid()
名稱getname()
狀態getstate()
優先順序getpriority()
是否有後台執行緒
isdaemon()
是否存活
isalive()
是否被中斷
isinterrupted()
說明:1、id 是執行緒的唯一標識,不同執行緒不會重複。
2、名稱是各種除錯工具用到。
3、狀態表示執行緒當前所處的乙個情況。
4、優先順序高的執行緒理論上來說更容易被排程到 。
5、關於後台執行緒,需要記住一點:jvm會在乙個程序的所有非後台執行緒結束後,才會結束執行。
7、是否存活,即簡單的理解,為 run 方法是否執行結束。
五、執行緒中斷
目前常見的有以下兩種方式:
1、 通過共享的標記來進行溝通
public
class
threadtest6
catch
(interruptedexception e)
} system.out.
println
("轉賬被終止");
}}; thread.
start()
; system.out.
println
("有內鬼終止交易");
thread.
sleep
(1000);
isquit =
true;}
}
2.、呼叫 interrupt() 方法來通知
public
class
threadtest7
catch
(interruptedexception e)
} system.out.
println
("轉賬被終止");
}}; thread.
start()
; system.out.
println
("有內鬼,終止交易");
thread.
interrupt()
;}}
重點說明第二種方法:
通過 thread 物件呼叫 interrupt() 方法通知該執行緒停止執行
thread 收到通知的方式有兩種:
(1) 如果執行緒呼叫了 wait/join/sleep 等方法而阻塞掛起,則以 interruptedexception 異常的形式通知,清除 中斷標誌
(2) 否則,只是內部的乙個中斷標誌被設定,thread 可以通過
thread.interrupted() 判斷當前執行緒的中斷標誌被設定,清除中斷標誌 。
thread.currentthread().isinterrupted() 判斷指定執行緒的中斷標誌被設定,不清除中斷標誌。
第二種方式通知收到的更及時,即使執行緒正在 sleep 也可以馬上收到。
六、等待乙個執行緒—join()
有時,我們需要等待乙個執行緒完成它的工作後,才能進行自己的下一步工作。例如,張三只有等李四轉賬成功,才決 定是否存錢,這時我們需要乙個方法明確等待執行緒的結束。
public
class
threadtest11
catch
(interruptedexception e)}}
};thread thread2 =
newthread()
catch
(interruptedexception e)}}
};thread1.
start()
; thread2.
start()
; 會先讓thread1執行完畢才會執行下乙個程序
thread1.
join()
; 會先讓thread2執行完畢才會執行下乙個程序
thread2.
join()
;//由於前面兩個都使用了join()這個方法,所以主線程要等錢兩個執行緒執行完畢才繼續執行主線程
system.out.
println
("主線程執行完畢");
}}
附錄
方法說明
public void join()
等待執行緒結束
public void join(long millis)
等待執行緒結束,最多等 millis 毫秒
public void join(long millis, int nanos)
同理,但可以更高精度
七、獲取當前執行緒的引用方法
說明public static thread currentthread();
返回當前執行緒物件的引用
public
class
threadtest22
}
八、休眠當前執行緒
由於執行緒的排程是不可控的,所以,這個方法只能保證休眠時間是大於等於休眠時間的。
方法說明
public static void sleep(long millis) throws interruptedexception
休眠當前執行緒 millis 毫秒
public static void sleep(long millis, int nanos) throws interruptedexception
可以更高精度的休眠
linux新手入門必看
為什麼要學習linux?為什麼學linux,每個人都有自己的理由 linux是免費的不用花一分錢,能夠節約大筆的成本 linux是開源的,你可以根據自已的需要修改源 linux是開放的,有廣泛的社群,關於linux的討論要遠遠高於windows作業系統 學習linux可以更好的掌握計算機技術 lin...
Linux如何學(新手入門必看)
本節旨在介紹對於初學者如何學習 linux 的建議。如果你已經確定對 linux 產生了興趣,那麼接下來我們介紹一下學習 linux 的方法。學習大多類似鹿丁解牛,對事物的認識一般都是由淺入深 由表及裡的過程,循序才能漸進。學習 linux 同樣要有一定的順序和方法,當然這也是你學習本教程的意義。如...
Linux該如何學習(新手入門必看)
本節旨在介紹對於初學者如何學習 linux 的建議。如果你已經確定對 linux 產生了興趣,那麼接下來我們介紹一下學習 linux 的方法。學習大多類似鹿丁解牛,對事物的認識一般都是由淺入深 由表及裡的過程,循序才能漸進。學習 linux 同樣要有一定的順序和方法,當然這也是你學習本教程的意義。如...