package org.thread.cn;
public class Store{
private final int MAX_SIZE;
private int count;
public Store(int n){
MAX_SIZE=n;
count=0;
}
public synchronized void add(){
while(count>=MAX_SIZE){
System.out.println("store 已满");
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
count++;
System.out.println(Thread.currentThread().toString()+" put "+count);
this.notifyAll();
}
public synchronized void remove(){
while(count<=0){
System.out.println("store is empty");
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().toString()+" get "+count);
count--;
this.notify();
}
public static void main(String[] args) {
Store s=new Store(5);
Thread pro1=new Producer(s);
Thread pro2=new Producer(s);
Thread con1=new Consumer(s);
Thread con2=new Consumer(s);
pro1.setName("Producer");
pro2.setName("Producer2");
con1.setName("consumer");
con2.setName("consumer2");
pro1.start();
pro2.start();
con1.start();
con2.start();
}
}
class Producer extends Thread{
private Store s;
public Producer(Store s) {
// TODO Auto-generated constructor stub
this.s=s;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
s.add();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Consumer extends Thread{
private Store s;
public Consumer(Store s){
this.s=s;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
s.remove();
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
关于ThreadLocal:
ThreadLocal