質問

私は以下に混乱しています:
Javaプログラムでスレッドを使用するには、最も簡単な方法は、スレッドクラスを拡張し、実行可能なインターフェイスを実装する(または単に実行可能な実装)ことです。
スレッドの実行を開始します。スレッドのMethod start()を呼び出す必要があります。これは、スレッドのMethod run()を呼び出します。そして、スレッドが始まります。
メソッドstart()(私が間違っていない限り) 正確かつ一度だけ呼び出す必要があります 各スレッドに対して。その結果、RUNメソッド自体がスレッドの再計量のカスタム実装を容易にする無限のループのショートで実行されない限り、スレッドインスタンスを再利用することはできません。
今ジャバドックテキストをリンクします言う

実行可能な場合、実行するための呼び出しは、利用可能な場合は以前に作成されたスレッドを再利用します

これがどのように実装されているのかわかりません。エグゼキューターメソッドの実行方法でカスタムスレッドを提供します。

  ExecutorService myCachedPool = Executors.newCachedThreadPool();
  myCachedPool.execute(new Runnable(){public void run(){  
     //do something time consuming

  }});

このカスタムスレッドIがエグゼキューターフレームワークに削除するにはどうすればよいですか?
エグゼキューターは、プログラムではできませんが、メソッドstart()を1回以上呼び出すことができますか?私は何かを誤解していますか?

ありがとうございました。

役に立ちましたか?

解決

そうではないことに注意してください Executor それは呼び出します start() - これは ExecutorService. 。いいえ、それは呼んでいません start() 2回。それはあなたがそれを直接使用するタスクを開始しません Thread.start()...代わりに、スレッドプールの作業キューについて知っているスレッドを開始します。スレッドは基本的に、何らかの作業が行われるまで待ってから、それを拾って実行してから、待機に戻ります。したがって、スレッドはいくつかのタスクを実行しますが、 Thread.start() 一度だけ呼ばれます。

編集:コメントから判断すると、あなたは Runnable (これは実行されるタスクです)と Thread (これがタスクを実行するものです)。

同じスレッドが複数のタスクを実行できます。スレッドプールを使用していない非常に簡単な例については、これを考慮してください。

public class MultiRunnable implements Runnable
{
    private final List<Runnable> runnables;

    public MultiRunnable(List<Runnable> runnables)
    {
        this.runnables = runnables;
    }

    public void run()
    {
        for (Runnable runnable : runnables)
        {
             runnable.run();
        }
    }
}

(使用する潜在的なスレッドの安全性の問題を無視する List<T> 複数のスレッドから。)

あなたはすべての束を作成することができます Runnable さまざまなことをすることができるタスク、そしてシングルを作成する MultiRunnable それらを順番に実行します。そのインスタンスを渡します MultiRunnableThread コンストラクター、そしてスレッドを起動すると、元の実行可能なタスクがそれぞれ実行されます。それは助けますか?

他のヒント

Start()を複数回呼び出していません。代わりに、プールのスレッドが完成することはありませんが、ただ生き続けます---待っています。ソースコードは、見たい場合はダウンロードできます。

スレッドプールの各スレッドは簡単にできます wait() 執行者がそれを新しい実行可能に渡すためには、スレッドは独自のものです run() メソッドは完了していません。それは単に新しい実行可能なものが執行者に与えられるのを待つだけです。

スレッドを複数回「起動」するには、実行可能なものを作成します。例えば:

//NO
private class T extends Thread { //not necessary to implement runnable
    public void run(){
        //...
    }
}
void someMethod(){
    T a = new T();
    a.start();
    a.start(); //NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO
}

その代わり、

//Yes
private class T implements Runnable {
    public void run(){
        //...
    }
}
void someMethod(){
    T a = new T();
    new Thread(a).start();
    new Thread(a).start(); //YES YES YES
}

これを行うことも可能です:

void someMethod(){
    final Runnable r = new Runnable(){
        public void run(){
            //...
        }
    };
    new Thread(r).start();
    new Thread(r).start();
}
// r could also be a field of you class. 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top