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