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