|
1 wait和notify
当调用wait()方法时线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备
Object的方法:void notify(): 唤醒一个正在等待该对象的线程。void notifyAll(): 唤醒所有正在等待该对象的线程。notifyAll使所有原来在该对象上等待被notify的线程统统退出wait状态,变成等待该对象上的锁,一旦该对象被解锁,它们会去竞争。notify只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其它同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁,此时如果该对象没有再次使用notify语句,即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。
2 wait和notify实例
子线程循环10次,主线程循环100次。接着子线程循环10次,主线程循环100次。如此循环50次。摘自张孝祥老师线程视频源码。
public class TraditionalThreadCommunication{ 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 synchronizedvoid 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(); }}
3 Condition实例
public class Condition1Test{ public static void main(String[] args) f6737732F#646#7732WvfFS7732WvC7%67V"b3c732VW"#&VV6b3c732Wvs7&VV6FFb3c6t6F6FFb3c6t6F6FFb3c6t6F732V732Wv&37732WvC7732F#77732ḴWvC77766732Wv7732Wv7%67V"b3c732VW"#732Wv76FvB732WvF67''WFVDW6WFRF6G&6R732Wv#7732WvC7b3c732VW"#fb3c732VW"#7b3C3b3C377FV&7732G&3C&VB6WVV33C7b3C3b3C3732G&3C33C7b3C3%67V"b3c732VW"#6F6v732Wv766732V732Wv&37732WvC7732F###77732ḴWvC77766732Wv7732Wv7%67V"b3c732VW"#732Wv76FvB732WvF67''WFVDW6WFRF6G&6R732Wv#7732WvC7b3c732VW"#fb3c732VW"#7b3C3b3C377FV&7732G&3C7V#"F&VB6WVV33C7b3C3b3C3732G&3C33C7b3C3%67V"b3c732VW"#6F6v732Wv766732V732Wv&37732WvC7732F##377732ḴWvC77766732Wv7732Wv7%67V"b3c732VW"#732Wv76FvB732WvF67''WFVDW6WFRF6G&6R732Wv#7732WvC7b3c732VW"#fb3c732VW"#7b3C3b3C377FV&7732G&3C7V#2F&VB6WVV33C7b3C3b3C3732G&3C33C7b3C3%67V"b3c732VW"#6F6v732Wv7666&S#
|