Итак, я смоделировал свою проблему производителя-потребителя, и у меня есть приведенный ниже код. Мой вопрос заключается в следующем :как остановится потребитель, если он находится в постоянном состоянии while (true ).
В приведенном ниже коде я добавил
if (queue.peek()==null)
Thread.currentThread().interrupt();
, что хорошо работает в этом примере. Но в моем реальном дизайне это не работает (иногда производителю требуется больше времени, чтобы «поместить» данные, поэтому исключение, выдаваемое потребителю, неверно. В общем, я знаю, что могу поместить «отравленные» данные, такие как Object is 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();
}
}
}