5

私は通常、以下のように無限ループを使用します。

public static boolean start = false;

while(!start) {
    doMyLogic();
}

しかし、友人は、while-true ループ内で小さな遅延が必要であると言いました (以下のように)。そうしないと、メモリの問題が発生する傾向があり、良い習慣ではありません。

推奨される方法:

while(!start) { 
    Thread.sleep(few_miliseconds);  // 500 ms
    doMyLogic();
}

提案された方法の影響を教えてください。私はそれを正しくやっていますか?

4

5 に答える 5

3

ScheduledExecutorService を使用します

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        doMyLogic();
    }
}, 500, 500, TimeUnit.MILLISECONDS);

このサービスは、多くの反復タスクまたは遅延タスクに再利用できshutdown()、必要に応じて使用できます。

于 2012-10-26T14:41:41.683 に答える
2

一時停止がない場合、CPU は常に何かを実行しています。CPUを効果的にブロックしています。ただし、一時停止 (sleep()) を追加すると、CPU に休憩を与えて他のことを行うことになります。

于 2012-10-26T14:23:19.917 に答える
2

まあ、遅延に関係なくメモリリークが発生するため、メモリの問題はないと思います(doMyLogicメソッドにメモリの問題がない限り)。スリープの本当の利点は、ほとんどの場合、コードがコンピューターのように速く doMyLogic である必要がないことです。たとえば、doMyLogic がファイルがディレクトリに作成されたかどうかを確認しているとします。1 秒に 1 回で十分な場合は、そのシナリオ (多くの CPU とディスク I/O が必要になる) では、コンピューターに 1 秒に数百回チェックさせる必要はありません。

タイミングがない場合の最大の影響は、余分な CPU 時間と、ロジック関数が持つその他のリソースを使用することです。ほとんどの場合、エンド ユーザーには目に見える影響はありません。

于 2012-10-26T14:24:01.940 に答える
2

メモリの問題ではありませんが、CPU をブロックしています。必ず遅延を使用してください。

また、doMyLogic()方法によっても多少異なります。

于 2012-10-26T14:22:05.227 に答える
2

(半) 無限ループにスリープを挿入することは、常に良い習慣です。これにより、コード実行がスリープに達したときに、他のスレッドも実行できるようになります。

于 2012-10-26T14:22:07.747 に答える