Java同步機制:synchronized,wait,notify
/**
* 假設A,B兩個線程同時運行。但A需要某項前置條件必須滿足(data數組裝滿)後才可以正常運轉。 這裡讓B線程去為滿足A的條件去干活。
*/
public class SYN {
int[] data = new int[100];
final Object lock = new Object();
public SYN() {
new Thread(new A()).start();
new Thread(new B()).start();
}
private class A implements Runnable {
public void run() {
/**
* 因為A需要前置條件(data數據裝滿)必須得到滿足才能運行,所以,在A需要的data數組不滿時,先讓A等待(實際上是等待B。
* A在等待的同時;B在干活,B裝載data數組)
*/
synchronized (lock) {
try {
System.out.println("A開始等待...");
lock.wait();
System.out.println("A結束等待!");
System.out.println("A前置條件滿足,開始做想做的事...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
private class B implements Runnable {
public void run() {
synchronized (lock) {
System.out.println("B開始操作...");
/**
* 這裡假設B線程對數組data的數據裝載需要費時的操作(如從網絡下載)。B先於A,把A需要的數據data裝載完畢,然後通知A
*/
for (int i = 0; i < 100; i++) {
data[i] = i;
try {
Thread.sleep(10);
} catch (Exception e) {
}
}
System.out.println("B結束操作!");
lock.notify();
/** 通知A */
}
}
}
public static void main(String[] args) {
new SYN();
}
}