你真的了解Java的多線程方法嗎
Java 多線程方法詳解
start
start
方法 啟動(dòng)線程 在start方法中調(diào)用start0
方法,而start0
是一個(gè)本地方法,其底層是C++實(shí)現(xiàn)的。
public synchronized void start() { if (threadStatus != 0) throw new IllegalThreadStateException(); group.add(this); boolean started = false; try { start0(); started = true; } finally { try { if (!started) { group.threadStartFailed(this); } } catch (Throwable ignore) { } } } private native void start0();
run
run
方法 子線程的執(zhí)行體,在其方法體中編寫線程邏輯,run
方法和普通成員方法一樣,可以重復(fù)調(diào)用,當(dāng)我們單獨(dú)調(diào)用run
方法時(shí)會(huì)在當(dāng)前線程中執(zhí)行run
方法,并不會(huì)啟動(dòng)新線程。
yield
yield方法線程讓步暫停當(dāng)前線程的執(zhí)行,并讓步于其他同優(yōu)先級(jí)的線程,讓其他線程先執(zhí)行
yield方法是Thread類中的靜態(tài)方法
public static native void yield();
特點(diǎn)
yield
方法的讓步,能讓正在執(zhí)行的線程由“運(yùn)行狀態(tài)”進(jìn)入到“就緒狀態(tài)”,等待調(diào)度執(zhí)行。yield
僅僅是讓出CPU資源,讓給誰(shuí),是有系統(tǒng)決定的,系統(tǒng)會(huì)讓其他相同優(yōu)先級(jí)或者是更高優(yōu)先級(jí)的線程來(lái)獲取執(zhí)行權(quán),要是沒(méi)有更高優(yōu)先級(jí)的線程,會(huì)繼續(xù)執(zhí)行原來(lái)的線程。
join
join
方法 線程合并 暫停當(dāng)前線程的執(zhí)行,等待子線程執(zhí)行完畢再繼續(xù)執(zhí)行當(dāng)前線程,也叫做線程插隊(duì),join
方法做的事情就是講并行或并發(fā)執(zhí)行的線程合并為串行執(zhí)行。
代碼示例:
public class ThreadMethod02 { public static void main(String[] args) throws InterruptedException { T2 t2 = new T2(); t2.start(); //主線程打印 int count = 0; for (int i = 1; i <= 10; i++) { Thread.sleep(1000); System.out.println("main" + i); if (++count == 5) { t2.join();//子線程插隊(duì) } } } } class T2 extends Thread { @Override public void run() { for (int i = 1; i <= 10; i++) { try { Thread.sleep(1000);//休眠一秒鐘 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("A" + i); } } }
運(yùn)行結(jié)果:
sleep
sleep
線程休眠,在sleep期間,線程運(yùn)行狀態(tài)從運(yùn)行進(jìn)入到阻塞狀態(tài),會(huì)讓出CPU的執(zhí)行權(quán),當(dāng)線程被重新喚醒時(shí),會(huì)由阻塞狀態(tài)進(jìn)入到就緒狀態(tài),等待CPU的使用權(quán)
方法介紹:
sleep
方法主要有兩個(gè),sleep(long millis)
和sleep(long millis, int nanos)
兩個(gè)方法功能類似,后一個(gè)方法提供更高精度的納秒級(jí)控制。sleep
方法是Thread里提供的靜態(tài)方法,當(dāng)前的方法也是可以拋出InterruptedException
異常,可以被Interrupt中斷掉。
Interrupt
代碼示例:
Interrupt
中斷線程 interrupt
方法調(diào)用僅僅修改了一個(gè)中斷標(biāo)志。 如果當(dāng)前線程是可中斷的狀態(tài)(調(diào)用了sleep、join、wait等方法導(dǎo)致線程進(jìn)入阻塞狀態(tài))在其他線程中調(diào)用interrupt方法,會(huì)立即拋出一個(gè)InterruptedException
異常,來(lái)停止掉中斷。如果當(dāng)前處于運(yùn)行狀態(tài),調(diào)用interrupt方法,線程會(huì)繼續(xù)執(zhí)行,直到發(fā)生sleep、join、wait等方法的調(diào)用,才會(huì)進(jìn)入阻塞。
Interrupt
方法在Thread類中,是一個(gè)普通方法,可以通過(guò)對(duì)象來(lái)調(diào)用。
public class ThreadMethod03 { public static void main(String[] args) throws InterruptedException { T3 t3 = new T3(); t3.start(); for (int i = 0; i < 3; i++) { Thread.sleep(1000); System.out.println(Thread.currentThread().getName()); } t3.interrupt();//發(fā)送中斷 } } class T3 extends Thread { @Override public void run() { for (int i = 0; i < 3; i++) { System.out.println("A"); } try { System.out.println("進(jìn)行休眠"); Thread.sleep(20000); } catch (InterruptedException e) { System.out.println(Thread.currentThread().getName() + "被Interrupted!!!"); } } }
運(yùn)行結(jié)果:
deamon
deamon
方法 守護(hù)線程 Java線程有兩種,一種是守護(hù)線程,一種是用戶線程,用戶線程一般用戶執(zhí)行用戶級(jí)任務(wù),一般創(chuàng)建的線程都是用戶線程,守護(hù)線程也叫做“后臺(tái)線程”服務(wù)于用戶線程,一般就是用來(lái)執(zhí)行后臺(tái)任務(wù),例如:垃圾回收就是由專門線程來(lái)處理的,負(fù)責(zé)垃圾回收的線程就是守護(hù)線程。
守護(hù)線程存在兩個(gè)方法
public final void setDaemon(boolean on)
設(shè)置守護(hù)線程,參數(shù)是true和false,true表明設(shè)置為守護(hù)線程, false,設(shè)置為非守護(hù)線程 ,默認(rèn)是false。
public final boolean isDaemon()
判斷是否守護(hù)線程,返回Boolean類型
代碼示例:
public class ThreadMethod04 { public static void main(String[] args) throws InterruptedException { T4 t4 = new T4(); t4.setDaemon(true);//將子線程設(shè)置為守護(hù)線程 t4.start(); if (t4.isDaemon()) {//判斷是否是守護(hù)線程 System.out.println("子線程是守護(hù)線程"); }else { System.out.println("子線程不是守護(hù)線程"); } for (int i = 1;i <= 5;i++) { Thread.sleep(1000); System.out.println(Thread.currentThread().getName() + i); } } } class T4 extends Thread { @Override public void run() { while (true) {//無(wú)限循環(huán) try { Thread.sleep(1000);// 休眠1s鐘 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); } } }
運(yùn)行結(jié)果:
主線程結(jié)束,子線程同時(shí)結(jié)束
Priority
Priority
線程優(yōu)先級(jí),就是用來(lái)指導(dǎo)線程執(zhí)行的優(yōu)先權(quán)
方法介紹
public final void setPriority(int newPriority)
:設(shè)置線程的優(yōu)先級(jí)public final int getPriority()
:獲取線程的優(yōu)先級(jí)
優(yōu)先級(jí)范圍
設(shè)置Java線程的優(yōu)先級(jí),最小值為1,默認(rèn)值是5,最大值是10
public final static int MIN_PRIORITY = 1; public final static int NORM_PRIORITY = 5; public final static int MAX_PRIORITY = 10;
方法特點(diǎn)
1. 線程的優(yōu)先級(jí)并不絕對(duì),所控制的是執(zhí)行的機(jī)會(huì),優(yōu)先級(jí)高的線程執(zhí)行的概率是比較大,而優(yōu)先級(jí)低的線程也并不是沒(méi)有機(jī)會(huì),只是執(zhí)行的概率會(huì)低一些。
2. 優(yōu)先級(jí)共10個(gè)優(yōu)先級(jí),分別為1-10,數(shù)值越大,表明優(yōu)先級(jí)越高,普通的線程優(yōu)先級(jí)是5。
3. 線程的優(yōu)先級(jí)是用來(lái)指導(dǎo)JVM層面優(yōu)先哪個(gè)線程執(zhí)行,最終執(zhí)行順序還是需要操作系統(tǒng)來(lái)指定。
4. 注意:代碼最好不要依賴于優(yōu)先級(jí)線程,有可能會(huì)造成問(wèn)題,Java中給定的優(yōu)先級(jí)并不一定嚴(yán)格按照給定優(yōu)先級(jí)執(zhí)行。
代碼示例:
public class ThreadMethod05 { public static void main(String[] args) { T5 t5 = new T5(); t5.setPriority(10);//設(shè)置優(yōu)先級(jí)為10 int priority = t5.getPriority();//獲取優(yōu)先級(jí) System.out.println(priority); } } class T5 extends Thread { @Override public void run() { System.out.println("A"); } }
運(yùn)行結(jié)果:
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
java基于odbc連接oracle的實(shí)現(xiàn)方法
這篇文章主要介紹了java基于odbc連接oracle的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了連接操作的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-09-09springboot熱部署知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理了關(guān)于springboot熱部署的知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們參考學(xué)習(xí)下。2019-06-06詳解SpringBoot中Controller接收對(duì)象列表實(shí)現(xiàn)
這篇文章主要介紹了詳解SpringBoot中Controller接收對(duì)象列表實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05解決阿里代碼規(guī)范檢測(cè)中方法缺少javadoc注釋的問(wèn)題
這篇文章主要介紹了解決阿里代碼規(guī)范檢測(cè)中方法缺少javadoc注釋的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08java網(wǎng)絡(luò)爬蟲連接超時(shí)解決實(shí)例代碼
這篇文章主要介紹了java網(wǎng)絡(luò)爬蟲連接超時(shí)解決的問(wèn)題,分享了一則使用httpclient解決連接超時(shí)的Java爬蟲實(shí)例代碼,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01詳解Spring Boot 項(xiàng)目啟動(dòng)時(shí)執(zhí)行特定方法
這篇文章主要介紹了詳解Spring Boot 項(xiàng)目啟動(dòng)時(shí)執(zhí)行特定方法,Springboot給我們提供了兩種“開機(jī)啟動(dòng)”某些方法的方式:ApplicationRunner和CommandLineRunner。感興趣的小伙伴們可以參考一下2018-06-06