我已经模拟了生产者消费者问题,并且有以下代码。我的问题是:如果消费者一直处于while(true)状态,他如何停止。
在下面的代码中,我添加了
if (queue.peek()==null)
Thread.currentThread().interrupt();
这在示例中很好用。但在我的实际设计中,这不起作用(有时生产者“放置”数据需要更长的时间,因此消费者抛出的异常是不正确的)。总的来说,我知道我可以放一个“毒药”数据,例如对象是XYZ,并在消费者中进行检查。但这个“毒药”会让代码看起来很糟糕。不知道是否有其他方法。
public class ConsumerThread implements Runnable
{
private BlockingQueue<Integer> queue;
private String name;
private boolean isFirstTimeConsuming = true;
public ConsumerThread(String name, BlockingQueue<Integer> queue)
{
this.queue=queue;
this.name=name;
}
@Override
public void run()
{
try
{
while (true)
{
if (isFirstTimeConsuming)
{
System.out.println(name+" is initilizing...");
Thread.sleep(4000);
isFirstTimeConsuming=false;
}
try{
if (queue.peek()==null)
Thread.currentThread().interrupt();
Integer data = queue.take();
System.out.println(name+" consumed ------->"+data);
Thread.sleep(70);
}catch(InterruptedException ie)
{
System.out.println("InterruptedException!!!!");
break;
}
}
System.out.println("Comsumer " + this.name + " finished its job; terminating.");
}catch (InterruptedException e)
{
e.printStackTrace();
}
}
}