производитель -потребление; как остановится потребитель?

Итак, я смоделировал свою проблему производителя-потребителя, и у меня есть приведенный ниже код. Мой вопрос заключается в следующем :как остановится потребитель, если он находится в постоянном состоянии 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();
    } 
}

}

5
задан adhg 27 April 2012 в 14:47
поделиться