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.运行案例并查看结果。