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

31-案例实现

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

案例实现

根据以下步骤完成本案例。

1.创建一个名为 Event 的类。该类存储了程序中所使用的事件信息。声明两个私有属性:一个是 java.util.Date 类型的属性date,一个 String 类型的属性event。生成读写这些属性的方法。

2.创建一个名为 WriterTask 的类,并实现 Runnable 接口:

public class WriterTask implements Runnable {

3.声明一个用于存储事件的队列,并在类构造器中完成队列初始化:

private Deque<Event> deque;
public WriterTask (Deque<Event> deque){
  this.deque=deque;
}

4.实现该任务类的 run() 方法。该方法包含100次的迭代循环。在每一次迭代中,我们创建一个新的事件并将其存储到队列当中,然后休眠1s:

@Override
public void run() {
  for (int i=1; i<100; i++) {
    Event event=new Event();
    event.setDate(new Date());
    event.setEvent(String.format("The thread %s has generated
                   an event", Thread.currentThread().getId()));
    deque.addFirst(event);
    try {
      TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) { 
      e.printStackTrace();
    }
  }
}

5.创建一个名为 CleanerTask 的类,并继承 Thread 类:

public class CleanerTask extends Thread {

6.声明一个用于存储事件的队列,并在类构造器中完成队列初始化:

private Deque<Event> deque;
public CleanerTask(Deque<Event> deque) {
  this.deque = deque;
  setDaemon(true);
}

7.实现 run() 方法。该方法包含一个无限循环,每次循环中,获取当前时间并调用 clean() 方法:

@Override
public void run() {
  while (true) {
    Date date = new Date();
    clean(date);
  }
}

8.实现 clean() 方法。该方法获取队列中的最后一个事件,如果该事件已创建超过10s,则从队列中删除该事件并检查下一个事件。如果删除了一个事件,则输出该事件信息及队列大小,便于观察执行过程:

private void clean(Date date) {
  long difference;
  boolean delete;
  if (deque.size()==0) {
   return;
  }  
  delete=false;
  do {
    Event e = deque.getLast();
    difference = date.getTime() - e.getDate().getTime();
    if (difference > 10000) {
      System.out.printf("Cleaner: %s\n",e.getEvent());
      deque.removeLast();
      delete=true;
    }
  } while (difference > 10000); 
  if (delete){
    System.out.printf("Cleaner: Size of the queue: %d\n",
                      deque.size());
  }
}

9.实现应用程序入口,创建包含 main() 方法的 Main 类:

public class Main {
  public static void main(String[] args) {

10.使用 Deque 类创建一个用于存储事件的队列:

Deque deque=new ConcurrentLinkedDeque();

11.根据`JVM`的可用处理器个数创建对应数量的线程,执行`WriterTask`任务,接着创建一个`CleanerTask`线程任务:
WriterTask writer=new WriterTask(deque);
for (int i=0; i< Runtime.getRuntime().availableProcessors();
     i++){
  Thread thread=new Thread(writer);
  thread.start();
}
CleanerTask cleaner=new CleanerTask(deque);
cleaner.start();

12.运行案例并查看结果。