0

Ich habe eine serielle Verbindung, die nur von einem einzigen Thread verwendet werden soll. Bevor ich jedoch eine neue Aufgabe an die Ausführenden übergebe, möchte ich überprüfen, ob diese bestimmte Aufgabe bereits in der Warteschlange enthalten ist (z. B. für Abfragewerte).ThreadPoolExecutor überprüfen, ob bestimmte Aufgabe in der Warteschlange ist

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; 
    } 

} 

Wenn ich überprüfe executor.getQueue() die Art BlockingQueue<Runnable> ist, aber wenn ich executor.getQueue().contains(task) die Methode equals von TaskRunnable tun ist mit einem Objekt vom Typ FutureTask genannt und ich bekomme diese Ausnahme

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

Jede Idee, wie ich kann, check Wenn ein bestimmter TaskRunnable bereits in der Warteschlange ist?

Antwort

0

Ersetzen Sie die executor.submit(Runnable) zu executor.execute(Runnable); es sollte dann nicht Ihre Runnable in seine eigene Aufgabe neu zu packen.

1

Sie müssen die Zukunft von executor.submit(runn); zurückgegeben speichern. Sie können dann fragen, ob die Warteschlange die Zukunft enthält.

Verwandte Themen