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.aiwalls.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();
}
}
}
}
運行的結果為
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
摘自 從點滴開始!!