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?