2010-12-28 4 views
0

для моих целей синтаксического анализа html, я внедрил ПРОИЗВОДИТЕЛЬ/ПОТРЕБИТЕЛЬСКИЙ ОБЗОР. Моя проблема заключается в том, как я могу остановить потребителя после того, как продюсер закончил задачу, а накопительный буфер - emtpy. ПРИМЕР:Возможно ли узнать, жив ли какой-то поток?

У меня есть один ПРОИЗВОДИТЕЛЬ и 5 ПОТРЕБИТЕЛЬ. Производитель перестает работать, потому что выполнил свои задачи. Так что потребитель может знать, что продюсер закончил свою работу? Я пытаюсь реализовать:

import java.util.concurrent.BlockingQueue; 

import java.util.concurrent.LinkedBlockingQueue; 

public class MainTest { 

    public static void main(String[] args) { 

    BlockingQueue queue = new LinkedBlockingQueue<String>(); 



    Producer p = new Producer(queue,"0"); 
    // FOR ALL CONSUMER I PASS THE REFERENCE TO THE UNIQUE PRODUCER !!! 
    Consumer c1=new Consumer(queue,"1",p); 
    Consumer c2=new Consumer(queue,"2",p); 
    Consumer c3=new Consumer(queue,"3",p); 
    Consumer c4=new Consumer(queue,"4",p); 
    Consumer c5=new Consumer(queue,"5",p); 

    p.start(); 

    c1.start();c2.start();c3.start();c4.start();c5.start(); 


    } 
} 
THE PRODUCER: 
class Producer extends Thread{ 

     BlockingQueue<String> queue; 

     public Producer(BlockingQueue<String> queue, String s) { 
      super ("THREAD"+s); 
     this.queue = queue; 
     } 

     @SuppressWarnings("deprecation") 
    public void run(){ 
     int messagecode = 1; 


boolean flagLavora= true; 
     //ciclo infinito 
     while(flagLavora){ 
      try { 
       System.out.println("-------------------------------------------------------------"); 


       System.out.println(" : IS ALIVE "+Thread.currentThread().isAlive()+" "); 
       System.out.println(" IS INTERRUPTED "+Thread.currentThread().isInterrupted()+" "); 

        System.out.println(this.getName()+">>"+"PRODUTT Thread"); 

       System.out.println("Producing "+(++messagecode)); 

        queue.put("[email protected]"+messagecode); 

         System.out.println(messagecode+" in queue"); 
       System.out.println("SIZE QUEUE:"+queue.size()); 


       if (messagecode %9==0) 
       { 
        System.out.println( "STATE PRODUTT "+ Thread.currentThread().getState()); 
        System.out.println(this.getName()+">>PRODUTT CLOSE"); 
        System.out.println( "IS ALIVE:"+ this.currentThread().isAlive()); 

        flagLavora= false; 


       } 
       System.out.println("-------------------------------------------------------------"); 


       sleep(1000); 



      } catch (InterruptedException e) { 
      e.printStackTrace(); 
      } 
     } 

    System.out.println( "\n \n EXIT CICLE WHILE \n \n"); 

     } 

THE CONSUMER: 
class Consumer extends Thread{ 

     static int id; 
     static Producer produttore=null; 
     int code=0; 
     BlockingQueue<String> queue; 

     public Consumer(BlockingQueue<String> queue,String nameThread, Producer p) { 

     super ("THREADN_ "+nameThread); 
     this.produttore=p; 
     this.queue = queue; 
     code=++id; 

     } 

     public void run(){ 

     while(true){ 
      try { 


       System.out.println("\n -------------------------------------------------------------"); 


       System.out.println("CONSUM "+this.getName()+":"+queue.size()+" SIZE QUEUE"); 
      if (produttore==null){ 




      stop(); 


     }   

      else if ( produttore.getState().compareTo(State.RUNNABLE) ==0 || queue.size()!=0){ 



    System.out.println(this.getName()+">> "+code+" waiting for the message..."); 

     String message = queue.take(); 
     System.out.println("Thread:"+code+" --> "+message+" taken!"); 

     if ( produttore.getState().compareTo(State.RUNNABLE) ==0 || produttore!=null){ 
      System.out.println("NULL PRODUTTORE + RUNNABLE"); 

    System.out.println("CONSUMATORE:"+Thread.currentThread().getName() +" CHIUDE \n"); 
    System.out.println("CONTENUTO PRODUTTORE: "+produttore==null); 


     stop(); 


} 

    System.out.println("------------------------------------------------------------- \n "); 


     //riposa 2 secondi 
    sleep(2000); 



     } 

     else { 

      sleep(1000); 
     } 




     } catch (InterruptedException e) { 
     e.printStackTrace(); 
     System.err.println("PROBLEMI CONSUMATORE:"+Thread.currentThread().getName()); 
     } 
    } 
    } 

ПОЭТОМУ Я хотел бы знаю, как реализовать сценарий в то время, продюсер complished задачи, чтобы добавить на струнных очередь, а когда закончил, умирает, и потребитель работает до тех пор, пока в очереди не будет чего-то, а потребитель жив.

Кто мог мне помочь? THANKS

+2

-1 - для не прикладывая в попытке форматировать ваш вопрос. –

ответ

2

Я не уверен, что понял.

Вы можете использовать метод Thread.IsAlive(), чтобы узнать, жива ли ваша продюсерская нить.

Ваш while будет выглядеть следующим образом:

while(produttore.isAlive() || !queue.isempty()) 
+0

Но .... Когда ПРОИЗВОДИТЕЛЬ = produttore, умер, с условием, если messagecode% == 0..Я не знаю, почему, когда я делаю produdttore.State(), печатаю RUNNABLE..InmeanWhile умер .. .ЗАЧЕМ?? – Bomberlatinos9

+0

Я попробовал ... но did'nt work :( – Bomberlatinos9

+0

СПАСИБО вам за ваше предложение, я изменил cicle с помощью: while (produttore.isAlive() ||! Queue.isEmpty() && produttore! = null) И теперь ВСЕ РАБОТЫ !!!^_^ – Bomberlatinos9

0

Постарайтесь подойти к проблеме по-другому. Вместо блокирующей очереди создайте Executor (используйте helper methods in Executors).

Затем для каждой задачи позвольте производителю передать задание исполнителю. Теперь вы можете просто ждать завершения исполнителем после того, как производитель отправил все задания (ExecutorService.awaitTermination()).

+0

Похоже, что это хорошая утилита для http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CompletionService.html. – whiskeysierra

Смежные вопросы