Java之synchronized,wait,notify组合运用示例
Java之synchronized,wait,notify结合运用示例
场景一:要求二个线程各自运行,中间不产生交互行为,等一个方法运行完了,在运行另外一个方法
运行结果:
它们之间没有交互的行为,就好像二个陌生人一样,各做各的,你们相识吧!
场景二 :要求二个线程之间相互交互
运行结果如下:
它们之间很好的进行了交互,一问一答,多么有趣呀
场景一:要求二个线程各自运行,中间不产生交互行为,等一个方法运行完了,在运行另外一个方法
public class SweetheartsTest { public static void main(String[] args) { new SweetheartsTest().init(); } private void init() { final Sweethearts sweethearts = new Sweethearts(); // 这二个方法不会产生交互,各执行各的,中间不会被打断 //synchronized作用于方法上,相当于在对象上加了锁 new Thread(new java.lang.Runnable() { public void run() { for (int i = 1; i <= 50; i++) { sweethearts.boy(i); } } }).start(); for (int i = 1; i <= 50; i++) { sweethearts.girl(i); } } class Sweethearts { synchronized void boy(int i) { System.out.println("我好想见到一个女孩呀,怎么没有呢!,次数: " + i); } synchronized void girl(int i) { System.out.println("怎么这条路上男孩子都没有一个呢!死哪了...,次数: " + i); } } }
运行结果:
怎么这条路上男孩子都没有一个呢!死哪了...,次数: 1 怎么这条路上男孩子都没有一个呢!死哪了...,次数: 2 怎么这条路上男孩子都没有一个呢!死哪了...,次数: 3 怎么这条路上男孩子都没有一个呢!死哪了...,次数: 4 怎么这条路上男孩子都没有一个呢!死哪了...,次数: 5 怎么这条路上男孩子都没有一个呢!死哪了...,次数: 6 怎么这条路上男孩子都没有一个呢!死哪了...,次数: 7 我好想见到一个女孩呀,怎么没有呢!,次数: 1 我好想见到一个女孩呀,怎么没有呢!,次数: 2 我好想见到一个女孩呀,怎么没有呢!,次数: 3 我好想见到一个女孩呀,怎么没有呢!,次数: 4 我好想见到一个女孩呀,怎么没有呢!,次数: 5 我好想见到一个女孩呀,怎么没有呢!,次数: 6 我好想见到一个女孩呀,怎么没有呢!,次数: 7 我好想见到一个女孩呀,怎么没有呢!,次数: 8 我好想见到一个女孩呀,怎么没有呢!,次数: 9 我好想见到一个女孩呀,怎么没有呢!,次数: 10 我好想见到一个女孩呀,怎么没有呢!,次数: 11 我好想见到一个女孩呀,怎么没有呢!,次数: 12 ....
它们之间没有交互的行为,就好像二个陌生人一样,各做各的,你们相识吧!
场景二 :要求二个线程之间相互交互
public class SweetheartsTest2 { public static void main(String[] args) { new SweetheartsTest2().init(); } private void init() { final Sweethearts bb = new Sweethearts(); // 这个类的二个方法,相互交互,很好的运用了wait与notify new Thread(new java.lang.Runnable() { public void run() { for (int i = 1; i <= 50; i++) { bb.boy(i); } } }).start(); for (int i = 1; i <= 50; i++) { bb.girl(i); } } class Sweethearts { boolean tag = false; synchronized void boy(int i) { //判断是否被女孩唤醒 while (!tag) { try { //继续等待女孩发问 wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //女孩问了,男孩回答 System.out.println("男孩说到:我叫刘风!"); //设置为等待女孩发问的标记 tag = false; //唤醒女孩发问 notify(); } synchronized void girl(int i) { //判断是否被男孩唤醒 while (tag) { try { //等待男孩的回答 wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //男孩回答完了,女孩又问他 System.out.print("女孩问到:Hello,小子叫什么名字呢!"); //设置为等待男孩回答的标记 tag = true; //唤醒男孩回答问题 notify(); } } }
运行结果如下:
女孩问到:Hello,小子叫什么名字呢!男孩说到:我叫刘风! 女孩问到:Hello,小子叫什么名字呢!男孩说到:我叫刘风! 女孩问到:Hello,小子叫什么名字呢!男孩说到:我叫刘风! 女孩问到:Hello,小子叫什么名字呢!男孩说到:我叫刘风!
它们之间很好的进行了交互,一问一答,多么有趣呀