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();