私は、ユーザーが指定したタイミング要件に従って、スレッド内のタスクの実行を完了するための非常に単純なおもちゃプログラムを作成しました。コードとサンプル出力は以下の通りです。何が起こるかは、コードを実行するたびに、タスクの完了時間が、ユーザーが指定した時間の+デルタ範囲内になるということです。例えば、ユーザが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!
したがって、並行性ユーティリティの使用をお勧めしますか?並行タスクの決定的な実行を可能にするコードを書く例はどこにありますか?この特定の単純なケースでは、私は決定論を決定するために、タスクの調整と並行性についてあまり気にしません。もちろん、複数のタスクがスケジュールされるとすぐに問題が発生しますが、まずは単純なものから始めたいと思います。 – iceman