您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Java中怎么創(chuàng)建自己的線程對(duì)象”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Java中怎么創(chuàng)建自己的線程對(duì)象”吧!
默認(rèn)情況下,主線程和垃圾回收線程都是由系統(tǒng)創(chuàng)建的,但是我們需要完成自己的功能----創(chuàng)建自己的線程對(duì)象。
* java將線程面向?qū)ο罅?形成的類(lèi)就是Thread,在Thread類(lèi)內(nèi)部執(zhí)行任務(wù)的方法叫run()
*
* 注意:如果想讓run作為任務(wù)區(qū),必須讓他去被自動(dòng)調(diào)用.我們通過(guò)執(zhí)行start()方法,來(lái)開(kāi)啟線程,繼而實(shí)現(xiàn)run方法的自動(dòng)調(diào)用.
## 直接使用Thread創(chuàng)建線程對(duì)象
// //分析:由于我們實(shí)現(xiàn)的實(shí)際功能Thread類(lèi)是決定不了的,所以沒(méi)有辦法將我們的功能放入Thread的run方法里
// //所以Thread的run 方法是一個(gè)空方法.如果我們想實(shí)現(xiàn)自己的功能,可以寫(xiě)Thread類(lèi)的子類(lèi),重寫(xiě)run方法
當(dāng)我們手動(dòng)調(diào)用run的時(shí)候,他失去了任務(wù)區(qū)的功能,變成了一個(gè)普通的方法.
//當(dāng)run作為一個(gè)普通方法時(shí),內(nèi)部對(duì)應(yīng)的線程跟調(diào)用他的位置保持一致.
## 鎖的條件:
* 1.鎖必須是對(duì)象 普通的對(duì)象/this/字節(jié)碼文件
* 2.要被所有的線程共享
*
* 注意:字節(jié)碼文件的使用范圍太大,一般不建議使用.
空喚醒
## Lock鎖
使用步驟
1.創(chuàng)建ReentrantLock lock = new ReentrantLock();對(duì)象,需要注意的是多個(gè)線程必須使用同一個(gè)
2.把之前的synchronized(鎖){ 用lock.lock()替換
3.把} 用lock.unlock();替換
好處
1.不要考慮鎖對(duì)象
2.代碼看起來(lái)更加簡(jiǎn)潔了
3.可以使用try..catch..finaly把lock.unlock放到finaly中,好處是如果該線程發(fā)生了異常,照樣可以釋放鎖
## 比較synchronized和Lock
* 1.synchronized:從jdk1.0就開(kāi)始使用的同步方法-稱(chēng)為隱式同步
* synchronized(鎖對(duì)象)
* {//獲取鎖 我們將鎖還可以稱(chēng)為鎖旗艦或者監(jiān)聽(tīng)器
同步的代碼}//釋放鎖
* 2.Lock:從jdk1.5開(kāi)始使用的同步方法-稱(chēng)為顯示同步
* 原理:Lock本身是接口,要通過(guò)他的子類(lèi)創(chuàng)建對(duì)象干活兒
* 使用過(guò)程:
* 首先調(diào)用lock()方法獲取鎖
* 進(jìn)行同步的代碼塊兒
* 使用unlock()方法釋放鎖
* 使用的場(chǎng)景:
* 當(dāng)進(jìn)行多生產(chǎn)者多消費(fèi)者的功能時(shí),使用Lock,其他的都使用synchronized
* 使用效率上:Lock高于synchronized
## 多線程的單例
//餓漢式,由于公共方法中只有一行公共的代碼,所以不會(huì)產(chǎn)生線程安全問(wèn)題
class SingleInstance1{
private static final SingleInstance1 s = new SingleInstance1();
private SingleInstance1() {
}
public static SingleInstance1 getInstance() {
return s;
}
}
//懶漢式,
class SingleInstance2{
private static SingleInstance2 s = null;
private SingleInstance2() {
}
public static SingleInstance2 getInstance() {
if (s == null) {//盡量減少線程安全代碼的判斷次數(shù),提高效率
synchronized (SingleInstance2.class) {//使用同步代碼塊兒實(shí)現(xiàn)了線程安全
if (s == null) {
s = new SingleInstance2();
}
}
}
return s;
}
## 線程停止
1.通過(guò)一個(gè)標(biāo)識(shí)結(jié)束線程
2.調(diào)用stop方法---因?yàn)橛泄逃械陌踩珕?wèn)題,所以系統(tǒng)不建議使用.
3.調(diào)用interrupt方法----如果目標(biāo)線程等待很長(zhǎng)時(shí)間(例如基于一個(gè)條件變量),則應(yīng)使用 interrupt 方法來(lái)中斷該等待。
到此,相信大家對(duì)“Java中怎么創(chuàng)建自己的線程對(duì)象”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。