本例子實現(xiàn)了兩個線程,每個線程輸出1到100的數(shù)字。第一個線程輸出1-10,停止,通知第二個線程 輸出1-10 第二個線程停止 通知第一個線程 輸出11-20 ...實現(xiàn)的要點是在java中,每個對象都有個對象鎖標(biāo)志(Object lock flag)與之想關(guān)聯(lián),當(dāng)一個線程A調(diào)用對象的一段synchronized代碼時,它首先要獲取與這個對象關(guān)聯(lián)的對象鎖標(biāo)志,然后執(zhí)行相應(yīng)的代碼,執(zhí)行結(jié)束后,把這個對象鎖標(biāo)志返回給對象;因此,在線程A執(zhí)行synchronized代碼期間,假如另一個線程B也要執(zhí)行同一對象的一段synchronized代碼時(不一定與線程A執(zhí)行的相同),它將要等到線程A執(zhí)行完后,才能繼續(xù)....
如何利用wait() notify() notifyAll()?
在synchronized代碼被執(zhí)行期間,線程可以調(diào)用對象的wait()方法,釋放對象鎖標(biāo)志,進(jìn)入等待狀態(tài),并且可以調(diào)用notify()或者notifyAll()方法通知正在等待的其他線程。notify()通知等待隊列中的第一個線程,notifyAll()通知的是等待隊列中的所有線程。
package jdeveloper.study;/*** Title: Jdeveloper's Java PRojdect* Description: n/a* Copyright: Copyright (c) 2001* Company: soho http://www.ChinaJavaWorld.com* @author jdeveloper@21cn.com* @version 1.0*/import java.lang.Runnable;import java.lang.Thread;public class DemoThread implements Runnable{public DemoThread() {TestThread testthread1 = new TestThread(this,"1");TestThread testthread2 = new TestThread(this,"2");testthread2.start();testthread1.start();}public static void main(String[] args) {DemoThread demoThread1 = new DemoThread();}public void run(){TestThread t = (TestThread) Thread.currentThread();try{if (!t.getName().equalsIgnoreCase("1")) {synchronized(this) {wait();}}while(true){
新聞熱點
疑難解答