10-案例实现
案例实现
根据以下步骤实现本案例。
1.创建 EventStorage 类。在该类中设置两个参数,即 int 类型的 maxSize 和 List<Date> 类型的 storage :
public class EventStorage {
private int maxSize;
private Queue<Date> storage;
2.实现该类的构造函数并在函数中完成参数的初始化:
public EventStorage(){
maxSize=10;
storage=new LinkedList<>();
}
3.实现同步方法 set() 。可以通过该方法存放一个事件到 storage 存储器中。首先,需要判断当前存储器是否为满载状态,如果当前存储器已满,则线程将通过 wait() 方法等待直到当前存储器出现闲余空间。在 set() 方法的末尾,将通过调用 notify() 方法唤醒调用 wait()方法沉睡的其他所有线程。本案例将忽略 Interrupted Exception 异常。在实际开发过程中,开发者仍然需要妥善处理 InterruptedException`异常,比如可以把异常重新抛出或者把异常转换为其他类型的异常:
public synchronized void set(){
while (storage.size()==maxSize){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
storage.offer(new Date());
System.out.printf("Set: %d",storage.size());
notify();
}
4.实现同步方法 get() 。可以通过该方法从存储器中获得事件信息。首先,程序会判断当前存储器是否包含事件,如果当前存储器中为空,则线程将通过 wait() 方法等待直到能够从当前存储器中取出事件。在 get() 方法的末尾可通过 notifyAll() 方法唤醒其他沉睡在 wait() 方法上的线程。本案例不处理方法中可能抛出的 InterruptedException 异常。但是在实际开发过程中,开发者仍然需要思考如何妥善处理这类异常,比如可以把异常重新抛出或者把异常转换为其他类型的异常:
public synchronized void get(){
while (storage.size()==0){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String element=storage.poll().toString();
System.out.printf("Get: %d: %s\n",storage.size(),element);
notify();
}
5.创建本案例中的生产者 Producer 类——该类实现了 Runnable 接口:
public class Producer implements Runnable {
6.向 Producer 类中添加一个 EventStorage 类型的对象,并且在构造函数中完成对象的初始化工作:
private EventStorage storage;
public Producer(EventStorage storage){
this.storage=storage;
}
7.实现 run() 方法,并且在该方法中调用 EventStorage 类上的 set() 方法100次:
@Override
public void run() {
for (int i=0; i<100; i++){
storage.set();
}
}
8.创建本案例中的消费者 Consumer 类——该类实现了 Runnable 接口:
public class Consumer implements Runnable {
9.向 Consumer 中添加 EventStorage 类型的对象,并且在构造函数中完成对象的初始化工作:
private EventStorage storage;
public Consumer(EventStorage storage){
this.storage=storage;
}
10.实现 run() 方法,在该方法中执行100次 EventStorage 类的 get() 方法:
@Override
public void run() {
for (int i=0; i<100; i++){
storage.get();
}
}
11.通过实现一个名为 Main 的类和增加 main() 方法来生成`主类:
public class Main {
public static void main(String[] args) {
12.创建 EventStorage 对象:
EventStorage storage=new EventStorage();
13.创建 Producer 对象和 Thread 类,并运行它:
Producer producer=new Producer(storage);
Thread thread1=new Thread(producer);
14.创建 Consumer 对象和 Thread 类,并运行它:
Consumer consumer=new Consumer(storage);
Thread thread2=new Thread(consumer);
15.同时执行上述两个线程:
thread2.start();
thread1.start();