当前位置:嗨网首页>书籍在线阅读

10-案例实现

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

案例实现

根据以下步骤实现本案例。

1.创建 EventStorage 类。在该类中设置两个参数,即 int 类型的 maxSizeList<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();