2012-04-04 10 views
2

私は20のスレッドを生成しています(すべて同時に実行されているはずです)。しかし、 これらはすべて同時に作成され、同時にすべてのプログラムが実行されるため、プログラム全体に大きな遅延が生じます(これは遅れていて、コンピュータが遅くない)。Javaでスレッドの生成を遅くするにはどうしたらいいですか?

だから私はそれらを異なる時間に作成したいと考えています。 2秒ごとに1つずつ生成する。これはどうすればいいですか?私は大量のものを使用しようとしましたが、どれもそれが望む方法では動作しません。私はブール値のメソッドを使用して、それが真になるまで再びループしないようにしようとしましたが、これはうまくいかないようです。何か案は?

for (int i = 0; i < 20; i++) { 
    Rain r = new Rain(); 
    r.start(); 
} 
+3

MacBook Proに1000秒間のスレッドを1秒で作成できます。あなたは遅れによって何を意味しているのか、なぜスレッド作成に誤りがあると思うのかをもう少し説明できますか? – Gray

+1

あなたはスレッドの優先順位を乱しているのですか、スレッド自体にたくさんのメモリを使用していますか?スレッド間の競合が多い場合を除いて、20スレッドは何の問題もないはずです... –

+1

20スレッド、または150スレッドは、目に見えないほどの時間がかかります。スレッドの中に何か他のことが起こっている場合は遅延が増えますが、 '遅れ'の妥当な解決策は低優先度のスレッドを1つ作成して低優先度で20/150の他のスレッドを作成することです。スレッド構築ループの中でSleep(2000)の必要性を見たことはありません。 –

答えて

4

、その後のThread.sleep(2000)

+0

ありがとう、私はそれを試しに行くよ – jackcogdill

+0

もし私ができるなら私は0.5ポイントを追加するだろう。好ましくは低優先度のジェネレータスレッドを使用して、20/150の低優先度スレッドを作成することは良い考えです。 sleep()はちょうどそうではありません。 –

+0

とにかくポイントを持ってください:) –

1

を実装し、それが作成するだけで20スレッドの遅れされますなぜ私は本当に見ていないが、あなたが置くことができ、スレッドとしてスレッドジェネレータを実行してみてください睡眠あなたがそれらを異なる時刻に開始されるようにする場合:

for (int i = 0; i < 20; i++) { 
    Rain r = new Rain(); 
    r.start(); 
    Thread.sleep(2000); 
} 
+0

大丈夫、それは今感謝します! (btw、それは150スレッドのようでした) – jackcogdill

3

あなたはおそらくちょうど各スレッドを産卵の間に2秒を眠るスポーナスレッドを作成することができます。

for (int i = 0; i < 20; i++) { 
    Rain r = new Rain(); 
    r.start(); 
    Thread.sleep(2000); 
} 

注:アウト左のtry-catchブロック

+0

この睡眠を奨励しないでください! –

+0

@MartinJamesここで睡眠を使わないのはなぜですか?睡眠法の悪い評判は主にその濫用によるものです。この質問を参照してください:http://stackoverflow.com/questions/3956512/java-performance-issue-with-thread-sleep –

2

あなたが原因あなたが作成しているスレッドの数にタイムラグが発生している場合は、最善の解決策は、あなたが作成しているスレッドの数を下げることが考えられます。

また、Java 5はexecutorサービスフレームワークを導入しました。これはJava 7でfork/joinを使用して再び改善されました。したがって、通常の状況下でスレッドを自分で作成する必要はありません。 (Hereは、これらの概念のかなり良い説明とページへのリンクです。)

は、私は一般的に、私はそうのように、マシン上のコアを持っているよりも多くのスレッドを起動しません

int availableThreads = Runtime.getRuntime().availableProcessors(); 
ExecutorService executorService = Executors.newFixedThreadPool(availableThreads); 

// ...Create List<Future<ReturnObject>> 
// populate list by calling futures.add(executorService.submit(callable)); 

executorService.shutdown(); 

ですなぜなら、計算集約型のプロセスであれば、単一のコア上でのスレッドの切り替えではなく、各コアでの同時計算を行うときに最大のスレッド化の利益が得られるからです。もちろん、それはディスクやネットワークを大量に消費するプロセスについて話しているときに変わりますが、それはかなり良い経験則です。