2009-08-11 46 views
1

我编写了一个非常简单的玩具程序,根据用户指定的时间要求完成线程内任务的执行。代码和示例输出如下。会发生什么情况是,每次运行代码时,任务完成时间都会在用户指定的时间的+ delta范围内。例如,如果用户想要在5秒内完成程序,则根据运行代码的CPU,它可以在5093或5012毫秒内完成。我想添加一些代码,它可以自动确定特定CPU为特定版本的JVM提供的最低延迟。根据该检测代码,可以将一个delta值添加到该行中,如: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"); 

    } 
} 

从英特尔迅驰1.7 Ghz的计算机输出样品(Java的热点(TM)客户端虚拟机(建设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实时:http://en.wikipedia.org/wiki/Real_time_Java 并退房:http://java.sun.com/j2se/1.5.0/docs/guide/concurrency/overview.html

你不应该写你自己的线程后Java 1 .5

+0

那么你建议使用并发工具?我在哪里可以找到允许确定性执行并发任务的代码编写示例?在这个特别简单的例子中,我并没有对任务协调和并发性感到困扰,因为我正在确定决定论。当然,一旦我安排了多项任务,问题就会出现,但我想先从简单的事情开始。 – iceman 2009-08-11 22:15:32

3

我也写了一些关于behaviour of Thread.sleep和其他可能与线程和Java相关的东西的东西。

简短的回答是,你要获得的粒度将取决于很多因素,其中一些因素是动态的。按照您的建议进行测试是一种前进的方法。你需要考虑插装的东西还包括:实际睡眠的

  • 行为VS特定条件下要求(参见我的文章在不同条件下一些典型行为的说明)
  • 线程中断延迟给定条件下(将部分依赖于CPU负载,系统的调度策略...)

另外,考虑改进控制回路,以便它基本上由(a)休眠所需的时间(在一个循环,保证了时间睡了),并且(b)在超时之后中断线程。

顺便说一句,总是使用System.nanoTime()为您的时间。否则,由于System.currentTimeMillis()在某些系统下的粒度很差,因此您只会混淆视图。