[英]Determining deterministic thread execution of a Java program
我编写了一个非常简单的玩具程序,根据用户指定的时间要求来完成线程内任务的执行。 代码和示例输出如下。 发生的情况是,每次您运行代码时,任务完成时间将在用户指定的时间的+增量范围内。 例如,如果用户要在5秒钟内完成程序,则根据运行代码的CPU,它可能在5093或5012毫秒内完成。 我想添加一些代码,这些代码可以自动确定特定CPU将为特定版本的JVM提供的最低延迟。 基于该检测代码,可以将delta值添加到以下行: if (( taskRunTime > patience+delta) && t.isAlive())
以便系统为任务执行定时带来更高的精度。 请给一些建议。
码:
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");
}
}
来自Intel 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!
我还写了一些有关Thread.sleep行为的内容,以及与线程和Java相关的其他有用内容。
简短的答案是,您要获得的粒度取决于许多因素,其中一些是动态的。 按照您的建议进行检测是前进的一种方法。 您需要考虑的有关检测的事项包括:
另外,请考虑改进控制循环,以使该循环本质上是(a)睡眠所需的时间(在一个循环中,确保睡眠了一定的时间),并且(b)在超时后中断线程。
顺便说一句,请始终使用System.nanoTime()进行计时。 否则,由于某些系统中System.currentTimeMillis()的粒度不佳,您只会感到困惑。
我建议您浏览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之后,您不应该编写自己的线程
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.