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(); www.zzzyk.com
}
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();
}
}
}
}
运行的结果为
补充:软件开发 , Java ,