단일 스레드에서만 직렬 연결을 사용합니다. 하지만 새 태스크를 집행자에게 제출하기 전에 해당 태스크가 이미 큐에 있는지 (예 : 폴링 값) 확인하고 싶습니다.ThreadPoolExecutor 특정 태스크가 대기열에 있는지 확인합니다.
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;
}
}
내가 유형이 BlockingQueue<Runnable>
하지만 난이 executor.getQueue().contains(task)
을 할 경우 TaskRunnable
의 equals 메소드는 유형 FutureTask
의 객체라고하며 나는이 예외를 어떻게 할 수
java.util.concurrent.FutureTask cannot be cast to ExecutorTest$TaskRunnable
모든 아이디어를 얻을 수 executor.getQueue()
을 선택하면 확인 어떤 특정 TaskRunnable
이 이미 대기열에 있다면?