1.7守护线程的创建与运行

1.创建一个实现Runnable接口的WriteTask类,每隔1秒向队列中添加一个Event对象。

import java.util.Date;
import java.util.Deque;
import java.util.concurrent.TimeUnit;

public class WriteTask implements Runnable{

    /**
     * Data structure to stores the events
     */
    Deque<Event> deque;

    /**
     * Constructor of the class
     * @param deque data structure that stores the event
     */
    public WriteTask (Deque<Event> deque){
        this.deque=deque;
    }

    /**
     * Main class of the Runnable
     */
    @Override
    public void run() {

        // Writes 100 events
        for (int i=1; i<100; i++) {
            // Creates and initializes the Event objects 
            Event event=new Event();
            event.setDate(new Date());
            event.setEvent(String.format("The thread %s has generated an event",Thread.currentThread().getId()));

            // Add to the data structure
            deque.addFirst(event);
            try {
                // Sleeps during one second
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

2.创建一个继承Thread类的CleanerTask类,该线程被设置成守护线程,作用是将队列中创建超过10秒的最后一个Event从该队列中删除,打印出信息,并重新统计队列的长度。

import java.util.Date;
import java.util.Deque;

public class CleanerTask extends Thread{

    /**
     * Data structure that stores events
     */
    private Deque<Event> deque;

    /**
     * Constructor of the class
     * @param deque data structure that stores events
     */
    public CleanerTask(Deque<Event> deque) {
        this.deque = deque;
        // Establish that this is a Daemon Thread
        setDaemon(true);
    }


    /**
     * Main method of the class
     */
    @Override
    public void run() {
        while (true) {
            Date date = new Date();
            clean(date);
        }
    }

    /**
     * Method that review the Events data structure and delete
     * the events older than ten seconds
     * @param date
     */
    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());
        }
    }
}

3.主类的实现

先让不断添加Event对象的线程跑起来,等待5秒之后,启动守护线程,守护线程不断地将生成时间超过10秒的队列中最后一个Event对象删除。

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.concurrent.TimeUnit;

public class ProtectMain {

public static void main(String[] args) {

        // Creates the Event data structure
        Deque<Event> deque=new ArrayDeque<Event>();

        // Creates the three WriterTask and starts them
        WriteTask writer=new WriteTask(deque);
        for (int i=0; i<3; i++){
            Thread thread=new Thread(writer);
            thread.start();
        }

        try
        {
            TimeUnit.SECONDS.sleep(5);//休眠5秒
        }catch(InterruptedException e)
        {
            e.printStackTrace();
        }

        // Creates a cleaner task and starts them
        CleanerTask cleaner=new CleanerTask(deque);
        cleaner.start();

    }
}

4.运行结果
这里写图片描述
可以看到的是经过一段时间的运行,队列中的Event对象数量始终维持在30以内。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值