Java多線程--yield()、join()、sleep()方法

yield()

禮讓線程,暫停線程 直接進入就緒狀態不是阻塞狀態作用是放棄當前CPU的資源,將資源讓給其它線程但放棄的時間不確定,有可能剛剛放棄,又馬上獲得了CPU時間片

public class YieldTest {
	public static void main(String[] args) {
		MyYield my = new MyYield();
		new Thread(my,"a").start();
		new Thread(my,"b").start();
	}
}
class MyYield implements Runnable{
	public void run() {
		System.out.println(Thread.currentThread().getName()+"-->start");
		Thread.yield();
		System.out.println(Thread.currentThread().getName()+"-->end");
	}
}

第一種輸出結果:

首先開啓兩個線程a和b,此時a搶奪到了CPU的執行權,執行run()方法,輸出第一句start,當執行到Thread.yield()時,a線程暫停並且直接進入到就緒狀態。此時b搶到了CPU的執行權,執行run()方法,輸出第一句start,當執行到Thread.yield()時,暫停b線程並且直接進入就緒狀態。a搶到執行權輸出end,同理b。

在這裏插入圖片描述

第二種輸出結果:

首先開啓兩個線程a和b,此時a搶奪到了CPU的執行權,執行run()方法,輸出第一句start,當執行到Thread.yield()時,a線程暫停並且直接進入到就緒狀態。此時a很幸運搶到了CPU的執行權,接着執行,輸出end。b線程同理

在這裏插入圖片描述

join()

public class JoinTest {
	public static void main(String[] args) {
		new Thread(new Father()).start();
	}
}
//父親類
class Father implements Runnable{
	public void run() {
		System.out.println("老爸想喝酒,發現沒酒了");
		System.out.println("給錢給兒子,叫兒子去買酒");
		Thread t = new Thread(new Son());
		t.start();//開啓兒子類線程
		try {
			//等待兒子買好酒...
			t.join();//調用者要等待被調用者執行完纔可以執行
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("老爸接過了酒,還把餘錢給了兒子");
	}
}

//兒子類
class Son implements Runnable{
	public void run() {
		System.out.println("兒子接了錢,去買酒了");
		System.out.println("看到了網吧,去玩了10s");
		for(int i=1;i<=10;i++) {
			System.out.println("玩了--"+i+"s了");
		}
		System.out.println("屁顛屁顛的跑去買酒");
		System.out.println("把酒給了老爸");
	}
}

輸出結果:

在這裏插入圖片描述

sleep(毫秒值)

可以讓正在運行的線程進入阻塞狀態,直到休眠時間滿了,進入就緒狀態。

public class SleepTest02 {
	public static void main(String[] args) throws InterruptedException {
		int num = 10;
		while(num!=0) {
			Thread.sleep(1000);
			System.out.println(num--);
        }
	}
}

輸出結果:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章