0

J'ai une connexion série qui ne doit être utilisée que par un seul thread. Mais avant de soumettre une nouvelle tâche aux exécuteurs, je veux vérifier si cette tâche est déjà dans la file d'attente (par exemple pour les valeurs d'interrogation).ThreadPoolExecutor vérifier si certaines Tâche est en file d'attente

executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(1); 
new Thread(new Runnable() { 

     @Override 
     public void run() { 
      while (true) { 
       for (int i = 0; i < 10; i++) { 
        try { 
         Thread.sleep(100); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
        TaskRunnable runn = new TaskRunnable(
          Integer.toString(i), "42"); 
        if (!executor.getQueue().contains(runn)) { 
         executor.submit(runn); 
        } 
       } 
      } 
     } 
    }).start(); 


public void write(String addr, String value) { 
    // write 
    try { 
     Thread.sleep(1000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

class TaskRunnable implements Runnable { 
    String addr, value; 

    public TaskRunnable(String addr, String value) { 
     this.addr = addr; 
     this.value = value; 
    } 

    @Override 
    public void run() { 
     write(addr, value); 
     System.out.println("Executed: " + addr + " - " 
       + executor.getQueue().size()); 
    } 

    @Override 
    public boolean equals(Object obj) { 
     TaskRunnable other = (TaskRunnable) obj; 
     return this.addr.equals(other.addr); 
    } 

    @Override 
    public int hashCode() { 
     int hash = 7; 
     hash = 17 * hash + (this.addr != null ? this.addr.hashCode() : 0); 
     return hash; 
    } 

} 

Si je vérifie executor.getQueue() le type est BlockingQueue<Runnable> mais si je fais executor.getQueue().contains(task) la méthode equals de TaskRunnable est appelée avec un objet de type FutureTask et je reçois cette exception

java.util.concurrent.FutureTask cannot be cast to ExecutorTest$TaskRunnable 

Toute idée comment je peux check Si un certain TaskRunnable est déjà dans la file d'attente?

Répondre

0

Remplacez le executor.submit(Runnable) par executor.execute(Runnable); il ne devrait alors pas replacer votre Runnable dans sa propre tâche.

1

Vous devez stocker le futur retourné de executor.submit(runn);. Vous pouvez ensuite demander si la file d'attente contient le futur.