2

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

だから、私はそれらを異なる時間に作成したいと思っています。たとえば、2秒ごとに1つ生成します。どうすればいいですか?たくさんのものを使ってみましたが、どれも思い通りに機能しません。ブール値メソッドを使用して、true になるまで再度ループしないようにしましたが、うまくいかないようです。何か案は?

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

4 に答える 4

4

スレッド ジェネレーターをスレッドとして実行してみてから、Thread.sleep(2000) を実装してください。

于 2012-04-04T20:13:08.310 に答える
3

おそらく、各スレッドのスポーンの間に 2 秒間だけスリープするスポナー スレッドを作成することもできます。

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

注: try-catch ブロックを省略しました

于 2012-04-04T20:16:41.860 に答える
2

作成しているスレッドの数が原因で遅延が発生している場合、おそらく最善の解決策は、作成しているスレッドの数を減らすことです。

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

私は通常、次のように、マシンにあるコアよりも多くのスレッドを開始しません。

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();

これは、プロセスが計算集約的である限り、単一のコアでスレッドを切り替えるのではなく、各コアで同時計算を行うときに最大のスレッド化の利益が得られるためです。もちろん、ディスクやネットワークを集中的に使用するプロセスについて話している場合は状況が変わりますが、これはかなり良い経験則です。

于 2012-04-05T00:30:05.273 に答える
1

作成するスレッドが 20 個しかないのに遅れる理由がよくわかりませんが、別の時間に開始したい場合は、スリープ状態にすることができます。

for (int i = 0; i < 20; i++) {
    Rain r = new Rain();
    r.start();
    Thread.sleep(2000);
}
于 2012-04-04T20:14:49.910 に答える