0

についての問題に直面しましたThreadPoolExecutor

いくつかのコードを書いた後、メソッドはプログラムによってスローされたsubmit()ものを食べますが、メソッドは RuntimeException を再スローすることがわかりました。この理由が知りたいです。RuntimeExceptionexecute()

最近、スレッド プールのソース コードを読み、ThreadPoolExecutor原理を理解しました。メソッドの実行方法は理解execute()できましたが、メソッドの実行方法は理解できませんでしsubmit()た。メソッドがorをsubmit()ラップしてメソッドを呼び出すことだけを知っています。RunnableCallableFutureTaskexecute()

public Future submit(Runnable runnable)
{
    if(runnable == null)
    {
        throw new NullPointerException();
    } else
    {
        RunnableFuture runnablefuture = newTaskFor(runnable, null);
        execute(runnablefuture);
        return runnablefuture;
    }
}

だから、私の問題は次のとおりです。どのようにThreadPoolExecutor実行FutureTaskされ、なぜRuntimeException食べられるのですか?

4

1 に答える 1

0

method を調べると、実際には のインスタンスであることnewTaskForがわかります。この FutureTask クラスにメソッドが表示されます。RunnableFuturejava.util.concurrent.FutureTaskrun

public void run() {
    sync.innerRun();
}

そして、これがinnerRunメソッドです:

    void innerRun() {
        if (!compareAndSetState(READY, RUNNING))
            return;

        runner = Thread.currentThread();
        if (getState() == RUNNING) { // recheck after setting thread
            V result;
            try {
                result = callable.call();
            } catch (Throwable ex) {
                setException(ex);
                return;
            }
            set(result);
        } else {
            releaseShared(0); // cancel
        }
    }

例外がキャッチされ、タスクに設定されます。FutureTask の get メソッドを呼び出すと、ExecutionException にラップされてスローされます。

 public V get() throws InterruptedException, ExecutionException {
    return sync.innerGet();
}
于 2013-06-24T07:49:10.530 に答える