0

私はシリアル接続を1つのスレッドだけが使用します。しかし、エグゼクティブに新しいタスクを提出する前に、特定のタスクがすでにキューに入っているかどうかチェックしたい(たとえばポーリング値)。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; 
    } 

} 

私はexecutor.getQueue()をチェックするとタイプがBlockingQueue<Runnable>ですが、私はexecutor.getQueue().contains(task)をすればTaskRunnableのequalsメソッドは、タイプFutureTaskのオブジェクトと呼ばれ、私はこの例外

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

にどのように私ができる任意のアイデアを得ます確認TaskRunnableがすでにキューに入っていれば?

答えて

0

executor.submit(Runnable)executor.execute(Runnable);に置き換えて、自分のタスクにRunnableを再パックしないでください。

1

executor.submit(runn);から返された未来を保存する必要があります。キューに未来が含まれているかどうかを尋ねることができます。

関連する問題