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?