0

단일 스레드에서만 직렬 연결을 사용합니다. 하지만 새 태스크를 집행자에게 제출하기 전에 해당 태스크가 이미 큐에 있는지 (예 : 폴링 값) 확인하고 싶습니다.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이 이미 대기열에 있다면?

답변

0

executor.submit(Runnable)executor.execute(Runnable);으로 바꾼다면 Runnable을 자체 작업으로 재 포장해서는 안됩니다.

1

executor.submit(runn);에서 반환 된 미래를 저장해야합니다. 그런 다음 큐에 미래가 포함되어 있는지 물어볼 수 있습니다.

관련 문제