2009-08-11 13 views
1

私は、ユーザーが指定したタイミング要件に従って、スレッド内のタスクの実行を完了するための非常に単純なおもちゃプログラムを作成しました。コードとサンプル出力は以下の通りです。何が起こるかは、コードを実行するたびに、タスクの完了時間が、ユーザーが指定した時間の+デルタ範囲内になるということです。例えば、ユーザが5秒でプログラムを完了したい場合、コードが実行されているCPUに従って、5093または5012msで完了することができる。特定のCPUが特定のバージョンのJVMに提供する最小レイテンシを自動的に判断できるコードを追加したいと思います。その計測コードに基づいて、デルタの値をif ((taskRunTime > patience+delta) && t.isAlive())のような行に追加することができます。これにより、システムはタスクの実行タイミングをより正確にします。いくつか提案してください。Javaプログラムの確定的なスレッド実行の決定

コード:

public class ThreadExample 
{ 


    static void threadMessage(String message) 
    { 
     String threadName = Thread.currentThread().getName(); 
     System.out.format("%s: %s%n", threadName, message); 
    } 

    private static class MessageLoop implements Runnable 
    { 
     public void run() 
     { 
      String importantInfo[] = 
      { 
       "A new integrated approach to programming", 
       "The innovative approach of the system", 
       "The input of a tracking system", 
       "A simulation system is then used for collision checking" 
      }; 
      try 
       { 
        for (int i = 0; i < importantInfo.length; i++) 
         { 

          Thread.sleep(4000); 
          threadMessage(importantInfo[i]); 
         } 
       } 
       catch (InterruptedException e) 
        { 
         threadMessage("I wasn't done!"); 
        } 
     } 
    } 

    public static void main(String args[]) throws InterruptedException 
    { 


     //Delay, in milliseconds before we interrupt MessageLoop 
     long patience = 1000 * 60 * 60; 

     //If command line argument present, gives patience in seconds. 
     if (args.length > 0) 
     { 
      try { 
       patience = Long.parseLong(args[0]) * 1000; 
      } catch (NumberFormatException e) { 
       System.err.println("Argument must be an integer."); 
       System.exit(1); 
      } 

     } 

     threadMessage("Starting MessageLoop thread"); 
     long startTime = System.currentTimeMillis(),taskRunTime=0; 
     Thread t = new Thread(new MessageLoop()); 
     t.start(); 

     threadMessage("Waiting for MessageLoop thread to finish"); 
     //loop until MessageLoop thread exits 
     while (t.isAlive()) 
     { 
      threadMessage("Still waiting..."); 
      //Wait maximum of 1 second for MessageLoop thread to finish. 
      t.join(100); 
      taskRunTime=System.currentTimeMillis() - startTime; 
      if ((taskRunTime > patience) && t.isAlive()) 
      { 
       threadMessage("Tired of waiting...task is running longer than the patience you set or the default!"); 
       t.interrupt(); 
       t.join(); 
      } 

     } 
     threadMessage("Finally out of thread!"); 
     System.out.println("Time to complete task="+taskRunTime+"ms"); 

    } 
} 

インテルのCentrinoからのサンプル出力1.7 GHzのマシン(は、Java HotSpot(TM)クライアントVM(10.0-B23、混合モードを構築する))

java -jar ThreadExample.jar 5 
main: Starting MessageLoop thread 
main: Waiting for MessageLoop thread to finish 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
Thread-0: A new integrated approach to programming 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Tired of waiting...task is running longer than the patience you set or the default! 
Thread-0: I wasn't done! 
main: Finally out of thread! 

答えて

0

私は示唆していますあなたはJava Real Timeに目を通します:http://en.wikipedia.org/wiki/Real_time_Java また、チェックアウトしてください:http://java.sun.com/j2se/1.5.0/docs/guide/concurrency/overview.html

Java 1の後にあなた自身のスレッドを書くべきではありません0.5

+0

したがって、並行性ユーティリティの使用をお勧めしますか?並行タスクの決定的な実行を可能にするコードを書く例はどこにありますか?この特定の単純なケースでは、私は決定論を決定するために、タスクの調整と並行性についてあまり気にしません。もちろん、複数のタスクがスケジュールされるとすぐに問題が発生しますが、まずは単純なものから始めたいと思います。 – iceman

3

私はまた、使用のかもしれないスレッドおよびJavaに関連するbehaviour of Thread.sleepや他のものについてのいくつかのものを書いています。

短い答えは、あなたが取得するつもりだ粒度は動的であるそのうちのいくつかの要因、たくさんのに依存することです。あなたが示唆しているようにそれを計器化するのも一つの方法です。あなたはインストルメントについて考える必要が物事は、次のとおりです。与えられた条件の下で

  • 与えられた条件の下で要求された対実際の睡眠の行動(異なる条件の下で、いくつかの典型的な行動を説明するための私の記事を参照)
  • スレッドの割り込みレイテンシ(意志それは、本質的に(a)の時間は寝ている確実に、ループ内で(必要な時間眠るように制御ループの改善を検討し、また

)... CPU負荷、システムのスケジューリングポリシーに一部依存)、(b)はタイムアウト後にスレッドを中断します。

ところで、いつもあなたのタイミングのためにSystem.nanoTimeの()を使用します。それ以外の場合は、システムによってはSystem.currentTimeMillis()の粒度が不十分なため、混乱するだけです。

関連する問題