• 定时器触发任务放入队列


    生产者每过一秒钟会将一个新任务放入缓冲,为了模拟消费者任务执行慢造成缓冲队列加长的情况,我们将消费者的定时器周期设置为两秒。这样,每过两秒钟,缓冲队列长度会增加1。下面我们看一下代码。

    Task类:

    public class Task

    {

    }

    生产者类:

    class Producer implements Runnable

    {

        private final Queue<Task> queue;

        private final static int MAX_SIZE = 200;

        Producer(Queue<Task> q)

        {

             queue = q;

        }

        public void run()

        {

             synchronized (queue)

             {

                 // 如果缓冲区满,该线程释放queue锁,等待

                 while (queue.size() >= MAX_SIZE)

                 {

                       try

                       {

                           queue.wait();

                       }

                       catch (InterruptedException e)

                       {

                           // TODO Auto-generated catch block

                           e.printStackTrace();

                       }

                 }

                 // 如果缓冲区不满,则继续添加任务

                 queue.add(new Task());

                 System.out.println("增加了一个任务,当前任务总数为 " + queue.size());

                 // 添加任务以后,通知所有处于等待状态的线程

                 queue.notifyAll();

             }

        }

    }

    消费者类:

    class Consumer implements Runnable

    {

        private final Queue<Task> queue;

        Consumer(Queue<Task> q)

        {

             queue = q;

        }

        public void run()

        {

             synchronized (queue)

             {

                 // 如果缓冲区内为空,消费者释放queue对象锁,处于等待状态

                 while (queue.size() <= 0)

                 {

                       try

                       {

                           queue.wait();

                       }

                       catch (InterruptedException e)

                       {

                           // TODO Auto-generated catch block

                           e.printStackTrace();

                       }

                 }

                 // 如果缓冲区不为空,消费者将队首元素取走

                 queue.remove();

                 System.out.println("执行了一个任务,当前任务总数为" + queue.size());

                 // 取走后通知所有处于等待状态的线程

                 queue.notifyAll();

             }

             try

             {

                 Thread.sleep(1000);

             }

             catch (InterruptedException e)

             {

                 // TODO Auto-generated catch block

                 e.printStackTrace();

             }

        }

    }

    生产者定时器类:

    public class ProducerTimerTask extends TimerTask

    {

        private final Queue<Task> queue;

        ProducerTimerTask(Queue<Task> q)

        {

             queue = q;

        }

        @Override

        public void run()

        {

             Producer p = new Producer(queue);

             new Thread(p).start();

        }

    }

    消费者定时器类:

    public class ConsumerTimerTask extends TimerTask

    {

        private final Queue<Task> queue;

        ConsumerTimerTask(Queue<Task> q)

        {

             queue = q;

        }

        @Override

        public void run()

        {

             Consumer c = new Consumer(queue);

             new Thread(c).start();

        }

    }

    主函数类:

    public class MainPro

    {

        public static void main(String args[])

        {

             Queue<Task> taskQueue = new LinkedList<Task>();

             Timer timer = new Timer();

             timer.schedule(new ProducerTimerTask(taskQueue), 0, 1000);

             timer.schedule(new ConsumerTimerTask(taskQueue), 0, 2000);

        }

    }

    下面我们看一下程序执行结果:

    增加了一个任务,当前任务总数为 1

    执行了一个任务,当前任务总数为0

    增加了一个任务,当前任务总数为 1

    增加了一个任务,当前任务总数为 2

    执行了一个任务,当前任务总数为1

    增加了一个任务,当前任务总数为 2

    增加了一个任务,当前任务总数为 3

    执行了一个任务,当前任务总数为2

    增加了一个任务,当前任务总数为 3

    增加了一个任务,当前任务总数为 4

    执行了一个任务,当前任务总数为3

    增加了一个任务,当前任务总数为 4

    增加了一个任务,当前任务总数为 5

    执行了一个任务,当前任务总数为4

    增加了一个任务,当前任务总数为 5

    增加了一个任务,当前任务总数为 6

    执行了一个任务,当前任务总数为5

    通过程序结果我们可以看出,每过两秒钟,任务队列就增加一个。

  • 相关阅读:
    links[v1]
    WebSocket handshake: Unexpected response code: 404
    Spring mvc 启动 和 请求分发
    匹配括号
    js parseFloat 精度问题
    遍历查找跳格子逻辑
    Generic type test java
    java高效判断素数
    从数组中取3个数全排列
    vue-cli
  • 原文地址:https://www.cnblogs.com/mu-tou-man/p/4840922.html
Copyright © 2020-2023  润新知