mu_tou_man

导航

 

生产者每过一秒钟会将一个新任务放入缓冲,为了模拟消费者任务执行慢造成缓冲队列加长的情况,我们将消费者的定时器周期设置为两秒。这样,每过两秒钟,缓冲队列长度会增加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

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

posted on 2015-09-26 16:26  mu_tou_man  阅读(2248)  评论(0编辑  收藏  举报