java中多线程 盒子中取值问题

 
package com.zhu.thread;

public class ThreadBox {
	public static void main(String[] args) {
		Box box = new Box();
		Producer pro = new Producer(box);
		Customer cus = new Customer(box);
		Thread tpro = new Thread(pro);
		Thread tcus = new Thread(cus);
		tpro.start();
		tcus.start();//这里假如线程Customer先得到cup的运行(cup运行是随机的)
	}
}

class Box {
	private int number;
	private boolean have = false;

	public synchronized int getNumber() {
		if (!have) {
			try {
				/**1,当Customer线程第一次调用getNumber方法时候如果number中没有值则hava为false
				 * 则会进入wait等待...
				 * 2,当Producer线程调用setNubmer方法时候会调用notify()方法此时只有一个线程处于wait中则会继续运行Customer线程
				 * 
				 */
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		have = false;
		notify();//得到值之后唤醒处于等待中的producer线程
		return number;
	}

	public synchronized void setNumber(int number) {
		if (have) {
			try {
				/**
				 * 1,当Producer线程第一次调用setNumber时候此时hava默认值为false线程不会进入
				 * wait等待状态...
				 * 2,当producer线程不等customer线程调用getNumber,第二次调用setNumber的时候此时have的值为true
				 * producer线程进入进入等待状态直到getNumber中调用notify()方法此时只有一个线程处于wait中则会继续运行producer
				 * */
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		have = true;
		this.number = number;
		// 注意在设置值之后在唤醒线程Customer
		notify();//设置值之后唤醒等待中的线程Customer
	}

}

class Customer implements Runnable {
	private Box box;

	public Customer(Box box) {
		this.box = box;
	}

	@Override
	public void run() {
		while (true) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("c 取" + box.getNumber());
		}
	}

}

class Producer implements Runnable {
	private Box box;
	private int i = 1;

	public Producer(Box box) {
		this.box = box;
	}

	@Override
	public void run() {
		while (true) {
			System.out.println("b 放" + i);
			box.setNumber(i);
			i++;
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}


运行的结果为

b 放1
c 取1
b 放2
c 取2
b 放3
c 取3
b 放4
c 取4
b 放5
c 取5
b 放6
c 取6
b 放7
c 取7
b 放8
c 取8
b 放9
c 取9
b 放10
c 取10
b 放11
c 取11
b 放12
c 取12
b 放13
c 取13
b 放14
c 取14
b 放15
c 取15
b 放16
c 取16
b 放17
c 取17
b 放18
c 取18
b 放19
c 取19
b 放20
c 取20
b 放21
c 取21
b 放22
c 取22
b 放23
c 取23
b 放24
c 取24
b 放25
c 取25
b 放26
c 取26
b 放27
c 取27
b 放28
c 取28
b 放29
c 取29

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值