web-dev-qa-db-ja.com

Javaプログラムをスレッド化せずにスリープ状態にする

Javaプログラムがいくつかの計算を実行し、その結果をMYSQLデータベース(同じネットワーク内の別のコンピューターでホストされている)にアップロードします。プログラムが計算を実行するよりも高速であるという問題に直面することがあります。結果をアップロードするため、すべての結果をアップロードすることはできません。プログラムは現在スレッド化されていません。

アップロードが適切に行われるように、計算が完了した後、プログラムを数ミリ秒間スリープさせる方法はありますか? (他の言語と同様に、スリープまたは待機機能)

プログラムをスレッド化することはできますが、書き直しが多すぎます。もっと簡単な方法はありますか?

ありがとう

12
Ank

アップロードが適切に行われるように、計算が完了した後、プログラムを数ミリ秒間スリープさせる方法はありますか? (他の言語と同様に、スリープまたは待機機能)

Thread.sleep(milliseconds)は、シングルスレッドプログラムでも機能するパブリック静的メソッドです。次のようなものが典型的なパターンです。

try {
    // to sleep 10 seconds
    Thread.sleep(10000);
} catch (InterruptedException e) {
    // recommended because catching InterruptedException clears interrupt flag
    Thread.currentThread().interrupt();
    // you probably want to quit if the thread is interrupted
    return;
}

Runnableを実装したり、スレッド呼び出しで他のことをしたりする必要はありません。いつでも呼び出すことができ、コードを一時停止できます。

11
Gray

スレッドを変更する必要はありません。あなたがする必要があるのは電話することだけです:

Thread.Sleep(5000); // pause the app for 5 seconds

すべてのアプリケーションはスレッドでもあり、あなたの場合はシングルスレッドアプリとも呼ばれます。 SleepのようなスレッドAPIは、他のコードやリファクタリングなしで使用できます。

ただし、注意が必要です: Thread.Sleepを使用して制御フローを管理する必要がある場合は、アーキテクチャに問題がある可能性があります。あなたのOPから、私はあなたがシングルスレッドアプリとして説明するものよりも懸念しています。あなたはある操作が別の操作を「上回っている」ようです。他の場所から非同期イベントを受信して​​いない限り、これは不可能です。

もう1つの注意点:スリープはミリ秒のパラメーターを取ります。これは通常任意であり、「しばらく待つ」という意味です。問題は、今日は「少しの間」は問題ないかもしれませんが、明日はマシンの負荷が高くなり、「少しの間」では十分ではなくなり、スリープが失効して同じエラーが表示されることです。確かに、タイムアウトを「長い間」に設定することはできますが、そうすると、すべてのトランザクションを「長い間」待つことになります...キャッチ22。

9
Paul Sasik

Thread.sleep()を使用します:

try
{
    Thread.sleep(1000); // Sleep for one second
}
catch (InterruptedException e)
{
    Thread.currentThread().interrupt();
}

これは、プログラムに新しいThreadを導入したり、他のThread関連の機械を必要としたりすることはありません。

3
hmjd

使用するだけです:-

try
{
Thread.sleep(<time in ms>);
}
catch(InterruptedException ex}
{
}

これにより、現在のスレッド(メインスレッドなど)がスリープ状態になります。

1
Martin

_Java.lang.Thread_クラスの静的メソッドsleep()は、呼び出されると、現在のスレッド(メインスレッドである可能性があります)を一時停止します。使用するのに特別なことをする必要はありません。

すべてのJavaアプリケーションはJVMのスレッドで実行されます。静的メソッドThread.sleepを呼び出すと、アプリケーションのスレッド(実行中のスレッド)が停止します。

あなたのプログラムはマルチ-スレッド化されていません...しかしそれはスレッドを使用しています。 Thread.Sleepは引き続き機能します。

0

プログラム全体をスレッドで書き直すことなく、計算後にThread.sleep();を使用できます。

0
foch