日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java提高——多线程(二)join、sleep、yield

發(fā)布時間:2025/6/16 java 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java提高——多线程(二)join、sleep、yield 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

join、sleep、yield都是Thread類的方法

join線程

join()方法:讓“主線程”線程等待“子線程”運行完之后再運行

//子線程 public class son extends Thread(){void run(){......} } //主線程 public class F() extends Thread{void run(){son s = new son(); s.start(); s.join(); ...} }

如:在主線程中調(diào)用子線程s.start()啟動子線程并調(diào)用s.join(),在調(diào)用s.join()之后主線程會一直等待,直到子線程運行完畢之后才接著運行。

源碼:

public final synchronized void join(long millis) throws InterruptedException {long base = System.currentTimeMillis(); long now = 0; if (millis < 0) {throw new IllegalArgumentException("timeout value is negative"); }if (millis == 0) {//判斷子線程是否還活著while (isAlive()) {wait(0);//讓當前CPU上運行的線程等待 }} else {while (isAlive()) {long delay = millis - now; if (delay <= 0) {break; }wait(delay); now = System.currentTimeMillis() - base; }} }

用事實說話:

class MyThread1 extends Thread{public MyThread1(String name) {super(name); }@Override public void run(){System.out.println(this.getName()+" start\n"); //延時操作 for (int i = 0; i < 1000; i++) {}System.out.println(this.getName()+"finish\n"); } } public class Demo extends Thread {public static void main(String[] args) throws InterruptedException {MyThread1 t = new MyThread1("myThread"); t.start(); t.join(); System.out.println(currentThread().getName()+" finish"); } }myThread start

myThreadfinish

main finish

結(jié)果顯示一樣

線程睡眠

sleep()方法:讓當前線程休眠,指定休眠時間,從“運行狀態(tài)”進入“休眠(阻塞)狀態(tài)”。喚醒之后線程進入“就緒狀態(tài)”等待CPU調(diào)度。

class MyThread1 extends Thread{public MyThread1(String name) {super(name); }@Override public void run(){System.out.println(this.getName()+" start\n"); //延時操作 for (int i = 0; i < 1000; i++) {if(i%4==0){//如果成立線程睡覺100mstry {Thread.sleep(100); } catch (InterruptedException e) {e.printStackTrace(); }}}System.out.println(this.getName()+"finish\n"); } } public class Demo extends Thread {public static void main(String[] args) throws InterruptedException {MyThread1 thread = new MyThread1("myThread"); thread.start(); thread.join(); System.out.println(currentThread().getName()+" finish"); } }
sleep & wait

wait()的作用也是能夠讓線程從“運行狀態(tài)”進入“休眠(阻塞)狀態(tài)”,同時釋放同步鎖但是sleep不會釋放同步鎖

public class SleepLockTest {static Object object = new Object(); public static void main(String[] args) {ThreadA ta = new ThreadA("t1"); ThreadA tb = new ThreadA("t2"); ta.start(); tb.start(); }static class ThreadA extends Thread{public ThreadA(String name) {super(name); }@Override public void run(){//獲取object對象的同步鎖 synchronized (object){for (int i = 0; i < 10; i++) {System.out.println(this.getName()+" "+i); if (i%4==0){try {Thread.sleep(100); } catch (InterruptedException e) {e.printStackTrace(); }}}}}} }

ta、tb會獲得同一個對象的同步鎖,ta在運行中會執(zhí)行Thread.sleep(100),但是tb不會獲得CPU的執(zhí)行權(quán),因為ta沒有釋放同步鎖。

注釋掉同步鎖之后:ta、tb可以互相切換

線程讓步?

yield():和sleep類似,讓線程從“運行狀態(tài)”到“就緒狀態(tài)”,但是不會阻塞線程,只是讓當前線程停一會兒,讓同優(yōu)先級的其他線程獲得被執(zhí)行的機會但是不保證一定會被執(zhí)行

yield&wait

1)wait讓線程從“運行狀態(tài)”到“阻塞狀態(tài)”,yield讓線程從“運行狀態(tài)”到“就緒狀態(tài)”

2)wait會釋放同步鎖,yield和sleep一樣不會釋放同步鎖

轉(zhuǎn)載請注明出處:http://www.cnblogs.comskywang12345/p/3479256.html

轉(zhuǎn)載于:https://www.cnblogs.com/huangzhe1515023110/p/9276096.html

總結(jié)

以上是生活随笔為你收集整理的Java提高——多线程(二)join、sleep、yield的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。