`

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

    博客分类:
  • Java
阅读更多
场景一:要求二个线程各自运行,中间不产生交互行为,等一个方法运行完了,在运行另外一个方法
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,小子叫什么名字呢!男孩说到:我叫刘风!

它们之间很好的进行了交互,一问一答,多么有趣呀
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics