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--);
}
}
}
輸出結果: