2012-04-10 13 views
10

スレッドごとに可変数を作成する必要があるたびに、 スレッドの配列を作成し、複数のスレッドを作成することでこれを行います。動的スレッド数の同時作成

しかし、これらのn個のスレッドをマルチスレッドのように動作させる方法はわかりません。 私はそれらを並行して実行したい。

このシナリオで何をするべきかをご案内してください。

+0

私の答えが役に立ったら、それを受け入れるようにしてください。 – Gray

答えて

2

基本擬似コード:

create x threads, store them in an array or list; 
for each thread in the list/array 
    call start() on the thread object; 
+0

そうすると、スレッドは並列に実行されていません。しかし、それらは順番に通常の関数呼び出しとして実行されています – sowmya

+0

@sowmya私はあなたがスレッドを読む必要があると思います。一連のスレッドでstart()を呼び出すと、順番に実行されているわけではなく、順番に開始されただけであることを意味します。 –

+0

しかし、彼らは私がそれらを開始する順番に関数を順番に実行しています。私の知る限り、少なくとも出力は変化するはずです。しかし、それは起こっていません。私が間違っているなら、私を訂正してください。 – sowmya

33

しかし、私は、マルチスレッドのコンセプトのように振る舞うのスレッドのこれらのn個の数を開始する方法を理解していません。私はそれらを並行して走らせたい。

あなたは確かにループを使用して、スレッドの配列を作成することができます

Thread[] threads = new Thread[NUM_JOBS_TO_CREATE]; 
for (int i = 0; i < threads.length; i++) { 
    threads[i] = new Thread(new Runnable() { 
     public void run() { 
      // some code to run in parallel 
      // this could also be another class that implements Runnable 
     } 
    }); 
    threads[i].start(); 
} 

これは、スレッドが並行してバックグラウンドで実行するようになります。それから後で一緒に参加して、それらのすべてが完了するのを待ってから続行してください。

// wait for the threads running in the background to finish 
for (Thread thread : threads) { 
    thread.join(); 
} 

しかし、その代わりにスレッドを自分で管理するのは、私は組み込みJava Executorsを使用することをお勧めします。彼らはあなたのためにこれをすべて行います。この方法の利点の1つは、タスクを実行するスレッドから分離することです。たとえば、1000スレッドと1000スレッドのタスクを並行して実行するために、10スレッドを開始できます。

// create a pool of threads, 10 max jobs will execute in parallel 
ExecutorService threadPool = Executors.newFixedThreadPool(10); 
// submit jobs to be executing by the pool 
for (int i = 0; i < NUM_JOBS_TO_CREATE; i++) { 
    threadPool.submit(new Runnable() { 
     public void run() { 
      // some code to run in parallel 
      // this could also be another class that implements Runnable 
     } 
    }); 
} 
// once you've submitted your last job to the service it should be shut down 
threadPool.shutdown(); 
// wait for the threads to finish if necessary 
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); 

詳細情報については、Java tutorial on the thread executorsを参照してください。

はここにいくつかのサンプルコードExecutorServiceです。

+0

1000のジョブがあると1000個のオブジェクトが作成され、パフォーマンスの問題が発生します –

+0

1000個のオブジェクトはかなり安い@ManojRamananです。 1000文字列は、オブジェクトの帯域幅の観点から、より高価です。百万のオブジェクトを作成した場合、いくつかのGCの問題が気付くかもしれません。そのため、Runnableプロデューサがコンシューマよりもはるかに高速であるために、通常はキューに境界を設定します。 – Gray

+0

ありがとうございます、私は現在、このimplementation.hを使用しているいくつかの情報を共有pls情報のための@グレー。あなたはそれをテストする –

2

スレッドの配列を作成せずにそれらを管理しようとすると非常に難しくなります。間もなく、うんざりしてしまいます。タスクを実行するスレッドプールが必要な場合は、プロデューサ - コンシューマキューが必要です。それを作成し、それを(メンバーとしてそれを含むスレッドプールオブジェクトインスタンス)をスレッドの作成時にスレッドに渡します。スレッドは丸くなり、タスクをフェッチして実行します。

これを行う簡単な方法は、@ Gray、(+1)で詳述されているExecutorServiceを使用することです。

私はもう一度言いますが、アレイ、リスト、ベクタ内のスレッドをマイクロ管理したり、起動したり、状態を「ボス/管理」ループでチェックしたり、終了/中止したり、破棄したりしないでくださいポルシェ911と似ています。巨額のお金と時間を費やした後、あなたはうまくいくと思われるものを手に入れ、突然あなたを破り、あなたを木にします。

長期間ブロックするジョブには専用スレッドを使用し、集中的にすばやく実行できるスレッドプールにはスレッドプールを使用します。私はクラスの先頭に設定マルチスレッドする必要がありますクラスで

+0

ありがとうマーティン!それは働いた...私はExecutoeServiceのコンセプトに従った。 – sowmya

0

:Javaの8+で

private static final ExecutorService executor = Executors.newCachedThreadPool();

&私は新しいスレッドで実行するために何かを必要な場所ラムダ式を使用します。 Javaは自動的にINAの期間の後にそれらを停止&システム上のCPUコアの数に応じたスレッドの合計数を管理しますnewCachedThreadPool

executor.submit(() -> { 
     myOtherClass.myFunction(doSomething); 
}); 

ctivity(デフォルトで60秒)。

関連する問題