Java同步機制:synchronized,wait,notify

weixin_34221276發表於2015-02-13


/**
 * 假設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();
	}
}

相關文章