1. 程式人生 > >java 多線程 day04 線程通信

java 多線程 day04 線程通信

rac void 註意 依次 cep final sta t對象 rup

package com.czbk.thread;

/**
* Created by chengtao on 17/12/3.
* 需求: 子線程先運行10次,然後主線程運行 100次,依次運行50次
*
wait(): 等待 如果線程執行了wait方法,那麽該線程會進入等待的狀態,等待狀態下的線程必須要被其他線程調用notify方法才能喚醒。
notify(): 喚醒 喚醒線程池等待線程其中的一個。
notifyAll() : 喚醒線程池所有等待 線程。

wait與notify方法要註意的事項:
1. wait方法與notify方法是屬於Object對象 的。
2. wait方法與notify方法必須要在同步代碼塊或者是同步函數中才能 使用。不在同步代碼裏執行,會報錯
3. wait方法與notify方法必需要由鎖對象調用。


wait():一個線程如果執行了wait方法,那麽改線程就會進入一個以鎖對象為標識符的線程池中等待。
此時 線程釋放了鎖,進入“臨時阻塞”狀態,並在其他線程調用notify方法才能將其喚醒,
喚醒後的該線程是“可 運行”狀態,獲得到cpu後即可執行。
Notify():如果一個線程執行notify方法,那麽就會喚醒以鎖對象為標識符的線程池中等待線程中的其中一個。
鎖對象是Object 對象;
只有同步代碼塊或同步方法中才有鎖;
線程池是以鎖為標識符建立的
*/

import java.util.concurrent.atomic.AtomicInteger;

public class Thread04_TraditionalThread_Communication {
public static void main(String[] args) {

final Business business = new Business();
new Thread(
new Runnable() {
public void run() {

for(int i=1;i<=50;i++){
business.sub(i);
}

}
}
).start();

for(int i=1;i<=50;i++){
business.main(i);
}

}

}
class Business {
private boolean bShouldSub = true;
public synchronized void sub(int i){
while(!bShouldSub){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=1;j<=10;j++){
System.out.println("sub thread sequence of " + j + ",loop of " + i);
}
bShouldSub = false;
this.notify();
}

public synchronized void main(int i){
while(bShouldSub){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=1;j<=100;j++){
System.out.println("main thread sequence of " + j + ",loop of " + i);
}
bShouldSub = true;
this.notify();
}
}

java 多線程 day04 線程通信