EventStorage : 资源类,用来存储共同资源
package thread.sync.two;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
public class EventStorage {
private int maxSize;
private List<Date> storage;
public EventStorage(){
maxSize = 50;
storage = new LinkedList<Date>();
}
public synchronized void set(String threadName){
while(storage.size() == maxSize){
System.out.println("---------------------------set等待中--------------------");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Date date = new Date();
((LinkedList<Date>) storage).offer(date);
System.out.println("+++++ "+threadName+ " : "+storage.size() +" Date:"+ date.toString());
notifyAll();
}
public synchronized void get(String threadName){
while(storage.size()==0){
System.out.println("---------------------------get等待中--------------------");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Date date = ((LinkedList<Date>) storage).poll();
System.out.println("---- "+threadName+ " : "+storage.size() +" Date:" + date.toString());
notifyAll();
}
}
MainTest : 此方法把生产者类(Producer)和消费者类(Consumer)都写成了内部静态类,没有在各自的生产和消费的run方法中循环,而是在main方法中模拟了多个生成者和消费者进行操作,比通用的在run方法里进行循环来得更形象
package thread.sync.two;
public class MainTest {
public static void main(String[] args) {
EventStorage storage = new EventStorage();
Consumer consumer = new MainTest.Consumer(storage);
Producer producer = new MainTest.Producer(storage);
Thread t = null;
for(int i=0;i<100;i++){
t = new Thread(producer," pro"+i);
t.start();
}
for(int i=0;i<100;i++){
t = new Thread(consumer," con"+i);
t.start();
}
}
static class Producer implements Runnable {
private EventStorage storage;
public Producer(EventStorage storage){
this.storage = storage;
}
@Override
public void run() {
storage.set(Thread.currentThread().getName());
}
}
static class Consumer implements Runnable {
private EventStorage storage;
public Consumer(EventStorage storage) {
this.storage = storage;
}
@Override
public void run() {
storage.get(Thread.currentThread().getName());
}
}
}