2

submit現在進行中のExecutorService(具体的にはThreadPoolExecutor)に接続したCallablesを取得できるようにしたいと思います(したがって、経由では利用できませんgetQueue())。

オーバーライドするサブクラスを作成しようとしましたbeforeExecuteが、そこに与えられたRunnableは、送信された元のCallableではなく、FutureTaskであることが判明しました。

アクティブなCallablesを決定する別の方法はありますか?


最終的に、この情報でやりたいことが2つあります。

  1. 実行中のタスクを取得して、ユーザーインターフェイスに表示できるようにします
  2. Callableが参照するファイルがパターンと一致するかどうかを確認し、一致する場合はキャンセルします
4

2 に答える 2

5

オーバーライドできます。元のとAbstractExecutorService.newTaskFor()にアクセスできるはずです。次に、トラッキングデコレータでそれらを装飾し、に渡します。RunnableCallablesuper.newTaskFor()

于 2012-09-13T21:18:42.633 に答える
1

axtavtによって提案されたように、私は次のサブクラスを作成しましたFutureTask

public class FutureCallable<V> extends FutureTask<V> {
    private Callable<V> callable;

    public FutureCallable(Callable<V> callable) {
        super(callable);
        this.callable = callable;
    }

    public Callable<V> getCallable() {
        return callable;
    }

}

ThreadPoolExecutorサブクラスのいくつかのメソッドを上書きします。

public class CustomThreadPoolExecutor extends ThreadPoolExecutor {
    private Set<FutureCallable<UpdateResult>> running = new HashSet<FutureCallable<UpdateResult>>();

    @Override
    public <T> FutureCallable<T> newTaskFor(Callable<T> callable) {
        return new FutureCallable<T>(callable);
    }

    @Override
    protected void beforeExecute(Thread t, Runnable r) {
        FutureCallable<UpdateResult> task = (FutureCallable<UpdateResult>) r;
        running.add(task);
    }

    @Override
    protected void afterExecute(Runnable r, Throwable t) {
        FutureCallable<UpdateResult> task = (FutureCallable<UpdateResult>) r;
        running.remove(task);
    }

    ...
}
于 2012-09-14T20:19:45.513 に答える