2012-04-17 15 views
2

私は、同時に2〜4つのスレッドを持つマルチスレッドプログラムを書いています。 スレッドの1つがタイムクリティカルスレッドであり、500ミリ秒ごとに呼び出されますが、10ミリ秒以上の遅延は許されません。しかし、他のスレッドが多くの負荷を持っている場合、私はいくつかの遅延、約2ミリ秒が発生することがわかります。タイムスタンプをチェックしてから10ミリ秒以上の遅延がないことを確認するために、ループ間隔を調整することを除いて、長時間実行した後に10ミリ秒以上の遅延が発生することは心配ですそれを安全にする方法はありますか?Javaでスレッドが遅れることはありませんか?

ありがとうございました。

答えて

1

あなたは、スレッドの優先順位を設定することができます。

myCriticalThread.setPriority(Thread.MAX_PRIORITY); 
otherThread.setPriority(Thread.NORM_PRIORITY); // the default 
yetAnotherThread.setPriority(Thread.MIN_PRIORITY); 

それは実際にも何かを保証するものではありません。

4

はあなたを含む完全なリアルタイムシステムのセットアップに力を入れない限り、OSが(他のプロセスに優先権を与えることを決定することができるので、あなたが、あなたのスレッドが遅延されないという保証はありませんReal-Time Java

+0

の中核。それは、いくらか重いWebSphereのクラッシュです。私はそこに良いリアルタイムのJavaソリューションはないと思っています。 –

+0

まあ、私はこのリンクをhttp://www.rtsj.org/に置いていたかもしれませんが、私はWebSphereサイトがコンセプトを要約していると思っています(実際は同じJSR [JSR-1のリファレンス実装です])。私はそれに取り組んできた経験があまりないのではないかと思いますが、RTSJはうまくいかないのですか? –

+0

私が知る限り、それはまだ仕様レベルであり、公開された研究です。 IBMのソリューションは塩の価値があるかもしれませんが、おそらくあなたをIBMの絞首刑に結びつけるでしょう。 –

0

必要があるような音変更されたOS)。言われていることを、基本的な作業のために、あなたは、このようなScheduledExecutorServiceを使用する必要があります。

class A { 
    private final ScheduledExecutorService exe = Executors.newScheduledThreadPool(1); 

    public void startCriticalAction(Runnable command) { 
    this.exe.scheduleAtFixedRate(command, 100, 100, TimeUnit.MILLISECONDS); 
    } 

    public void shutdown() { 
    this.exe.shutdown(); 
    } 
} 

エグゼキュータのサービスは、タスクごとに100ミリ秒を実行するために最善を尽くします。多くのことが間違っている可能性があるので、自分でこの機能を開発すべきではありません。

2

タイミングが重要な場合は、そのスレッド専用のコアでビジー待機を使用します。これにより、ほとんどの場合、マイクロ秒のジッターが10秒の< <になります。そのビットは極端で、論理スレッドは他のものに使用されません。

これは私が使用しているライブラリです。これを使用して、論理スレッドまたはコア全体を予約することができます。 Linux上のgrub.confに= isolcpusを使用することによりhttps://github.com/peter-lawrey/Java-Thread-Affinity

あなたは論理スレッドまたはコアは、(比較的小さく、< 2私たちは、遅延100 Hzのタイマーと電源管理を除く)任意の他のために使用されていないことを確認することができます

タイムアウトの
0

クリープアップ:

waitFor(int timeout) 
{ 
    dateTime wallTimeEnd; 
    wallTimeEnd=now()+(msToDateTime(timeout)); 
    int interval=timeout/2; 
    while(true){ 
    if(interval>10){ 
     sleep(interval); 
     interval=dateTimeToMs(wallTimeEnd-now())/2; 
    } 
     else 
     { 
     do{ 
      sleep(0); 
      interval=dateTimeToMs(wallTimeEnd-now()); 
     }while(interval>0); 
    } 
} 

これだけ浪費私はOPを助けるだろうとは思わない5-10ms

関連する問題