/** * * @描述: 子線程循環10次,接着回到主線程循環100次,又接着回到子線程循環10次,再接着回到主線程又循環100次,如次循環50次,請寫出程序 .. * @作者: Wnj . * @創建時間: 2017年5月15日 . * @版本: 1.0 . */ public class TraditionalThreadCommunication { /** * @param args */ public static void main(String[] args) { final Business business = new Business(); new Thread(new Runnable() { @Override public void run() { //循環50次 for (int i = 1; i <= 50; i++) { //子線程循環10次 business.sub(i); } } }).start(); //循環50次 for (int i = 1; i <= 50; i++) { //主線程循環100次 business.main(i); } } } /** * * 在Java.lang.Thread類中,提供了sleep(), 而java.lang.Object類中提供了wait(), notify()和notifyAll()方法來操作線程 sleep()可以將一個線程睡眠,參數可以指定一個時間。 wait()可以將一個線程掛起,直到超時或者該線程被喚醒。 wait有兩種形式wait()和wait(milliseconds). sleep和wait的區別有: 1,這兩個方法來自不同的類分別是Thread和Object 2,最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。 3,wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用 synchronized(x){ x.notify() //或者wait() } 4,sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常(使用wait,需要捕捉異常) */ class Business { private volatile boolean bShouldSub = true; /** * 子線程循環10次 * synchronized互斥 * @param i */ public synchronized void sub(int i) { //檢查 while (!bShouldSub) { try { this.wait();//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(); } /** * 主線程循環100次 * synchronized互斥 * @param i */ public synchronized void main(int i) { while (bShouldSub) { try { this.wait();//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(); }
