23

JavaのExecutorsクラスとnewCachedThreadPool( )メソッドを見始めたところです。API によると、結果として得られるスレッド プールは、既存のThreadオブジェクトを新しいタスクに再利用します。

既存のオブジェクトThreadの動作を設定できるメソッドが APIに見つからなかったため、これがどのように実装されているのか少し戸惑っています。Thread

たとえば、オブジェクトからnew を作成すると、のメソッドが呼び出されます。ただし、引数としてa を取るセッター メソッドは APIにありません。ThreadRunnableThreadRunnablerun( )ThreadRunnable

ポインタをいただければ幸いです。

4

6 に答える 6

28

基本的に、プールの各スレッドがこれを行っていると想像してください。

public void run() {
    while(true) {
        if(tasks available) {
           Runnable task = taskqueue.dequeue();
           task.run();
        } else {
           // wait or whatever
        }
    }
}
于 2012-12-04T09:21:51.283 に答える
5

スレッドプールには、実行可能なジョブを探すスレッドがあります。スレッドから新しいスレッドを開始する代わりにRunnable、関数を呼び出すだけrun()です。したがって、スレッドは、提供されたThreadPoolものでは作成されませんがRunnable、タスクを実行する準備ができているかどうかを確認し、それらを直接呼び出すだけのもので作成されます。

したがって、次のようになります。

while(needsToKeepRunning()){
    if(hasMoreTasks()){
        getFirstTask().run();.
    }
    else
    {
        waitForOtherTasks();
    }
}

もちろん、これは過度に単純化されていますが、待機を伴う実際の実装ははるかにエレガントです。これが実際にどのように機能するかについての優れた情報源は、Concurrency in Practiceにあります。

于 2012-12-04T09:19:47.470 に答える
4

スレッドは、スレッド プール APIで 1 回だけ作成されます (何らかの例外が原因でスレッドが突然終了した場合を除く)。

ワーカー スレッドはキューをポーリングして、タスクがあるかどうかを確認し、それを使用します。したがって、スレッドは決して終了しません。

スレッドが再利用されるのは単なる抽象化です (スレッドが実際に停止しないための抽象化)。明らかに、アイドルタイムアウトとシャットダウン要求の後に停止します。

Runnable -----> Thread Pools (一部のワーカー スレッドはその Runnable を消費し、他のワーカー スレッドはさらにいくつかの Runnable を待機します)

于 2012-12-04T09:20:53.837 に答える
2

簡単に説明すると、Runnable を ExecutorService に渡すと、Runnable がキューに入れられます。ThreadPool ワーカー スレッドは、このキューから読み取り、キューに入れられた Runnables の run() メソッドを呼び出します。

于 2012-12-04T09:23:21.843 に答える
2

Executors はバックグラウンドですべてを行います。はい、既存のスレッド API のみを使用します。

以下のリンクには、スレッド クラスとコレクション API を使用して実装されたスレッド プールのサンプル実装があります

于 2012-12-04T09:18:25.147 に答える
2

スレッドはRunnable.run()、彼に割り当てられたランナブルを呼び出すだけで済みます...

于 2012-12-04T09:20:08.313 に答える