首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

Java之synchronized,wait,notify组合运用示例

2012-10-08 
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与notifynew 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,小子叫什么名字呢!男孩说到:我叫刘风!

它们之间很好的进行了交互,一问一答,多么有趣呀

热点排行