多线程——waiting-notify机制实例(三个人打水)

//三个学生到一个水龙头下排队取水,三人都取完水后一起离开。

//这里涉及到如何判断三个人都取完水。如果用普通的静态成员,势必会要用无限循环来等待。更好的办法是用 wait-notify 机制。
//前两个学生取完水后都 wait,最后一个学生取完水后 notify,这样就能一起离开了。下面是代码示例:

package com.cs;

/**
 * 
 * @author Administrator 三个学生排队取水,取完后一起离开
 */
public class Test {

	private static final ValueLock water = new ValueLock();

	public static void main(String[] args) {
		String[] student_names = { "甲", "乙", "丙" };

		for (String student_name : student_names) {
			new Student(student_name).start();
		}
	}

	// 学生
	private static class Student extends Thread {

		private String name;

		private Student(String name) {
			this.name = name;
		}

		@Override
		public void run() {
			try {
				synchronized (water) {
					Thread.sleep(1000);

					System.out.println("学生" + name + "取完了水。");
					water.value++;

					if (water.value == 3) {
						System.out.println("三个人都取完了水。");
						water.notifyAll(); // 只要执行了这个,学生们都会离开。
					} else {
						water.wait(); // 同时释放了锁,下一个线程进入
					}
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("学生" + name + "离开了。");
		}
	}

	// 带值的锁
	private static class ValueLock {

		public int value;
	}
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值