2017-08-04 8 views
-1

私はThread.sleepでwhileループを結合したいので、コードはJavaのすべてのナノ秒またはマイクロ秒で実行されます。誰か助けてくれますか?私の悪い英語を申し訳ありません、私はオランダ語です。JavaでThread.sleepとwhileループを組み合わせるにはどうすればいいですか?

+1

あなたは何を試してみましたか?これを試みるためにあなたが書いたコードをいくつか見せてください。これは無料のコーディングサービスではありません – ja08prat

+1

あなたの持つ困難は何ですか?実際には 'while'ループの中で' Thread.sleep() 'を呼び出すことができます。うまくいかないものを試してみたら、コードを提示してください。それ以外の場合は、ここで質問をする前に自分で解決してみてください。 –

+0

私はこれを試しました: 'while(something){Thread.sleep(0,1000); // tryとcatchを使って何かした}}プログラムをフリーズするたびに、そのウィンドウを閉じなければなりません。タスクマネージャー。 –

答えて

3

マイクロ秒でスリープ状態にはならず、時間を確認するだけで数ナノ秒かかることがあります。

マイクロ秒を待つ場合は、ビジー状態を待つ必要があります。注:これは100%CPUを使用します。あなたがあれば、コードは

long delayNS = micros * 1000; 
long next = System.nanoTime(); 
while(running) { 
    next += delayNS; 
    while (next > Systen.nanoTime()) { } 
    // do something. 
} 

のために実行されますどのくらいの時間を考慮に入れる場合があります

while(running) { 
    long end = System.nanoTime() + micros * 1000; 
    while (end > Systen.nanoTime()) { } 
    // do something. 
} 

ので、コードは、すべてを実行します... Javaでマイクロ秒

コードには時間がかかりますが、イベント間に一定の間隔があります。

注:それはちょうど最も近いミリ秒にnanosを丸めるしかし

Thread.sleep(long millis, int nanos)があります。

あり、サブミリ秒とすることができるLockSupport.parkNanos(n)あるが(さらには1ナノ秒の遅延のために)典型的には約25マイクロ秒

16マイクロ秒を取ることができるThread.yield()あり、最小であるが、それはまた取ることができますもっと長い。

+0

実行中はどういう意味ですか?そして、マイクロは1の値を持っているのは正しいのですか? –

+0

@DaniëlvanderZwanフラグを使用して、ループ実行時間を決定することができます。 1マイクロ秒の間隔が必要な場合は、「マイクロ秒= 1」 –

+1

という値を使用することができます。これはCPUサイクルに影響することになるという答えに言及する価値があります。実際にはコードは常に実行中です。エグゼクティブ間のタイミング) –

0

これはThreadオブジェクトの中で実行できます。実行メソッドではtry catchの動作でwhileを置くことができます。

@Override 
public void run() 
{ 
    while (true) { 
     try 
     { 
      for (int cont = 0; cont < numberOfRequests; cont++) 
      { 
       new GetRequestMethod(url, httpClient, defaultRequestConfig, logOption).start(); 
      } 

      LOG.log(Level.INFO, "\n---------------Send REQUEST " + numberOfRequests + "---------------\n"); 

     } 
     catch (OutOfMemoryError m) 
     { 
      LOG.log(Level.SEVERE, "\n\n\n\n\n\n\n\n\n\nMemory Critical Error: " + m.getMessage() + "\n\n\n\n\n\n\n\n\n\n", m); 
      sleep(TIME_SLEEP_EXCEPTION); 
      renewManager(); 

     } 
     catch (Throwable t) 
     { 
      LOG.log(Level.SEVERE, "\n\n\n\n\n\n\n\n\n\nCritical Error!\n", t); 
      sleep(TIME_SLEEP_EXCEPTION); 
      renewManager(); 
     } 
    } 
} 

睡眠方法:

private void sleep(int time) 
{ 
    try 
    { 
     Thread.sleep(time); 
    } 
    catch (InterruptedException e) 
    { 
     LOG.log(Level.SEVERE, "\n\n\n\n\n\n\n\n\n\nSleeping Critical Error: " + e.getMessage() + "\n\n\n\n\n\n\n\n\n\n", e); 
    } 
関連する問題