簡體   English   中英

確定Java程序的確定性線程執行

[英]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相關的其他有用內容。

簡短的答案是,您要獲得的粒度取決於許多因素,其中一些是動態的。 按照您的建議進行檢測是前進的一種方法。 您需要考慮的有關檢測的事項包括:

  • 在給定條件下的實際睡眠行為與要求的行為(請參閱我的文章,以了解在不同條件下的一些典型行為)
  • 給定條件下的線程中斷延遲(將部分取決於CPU負載,系統的調度策略...)

另外,請考慮改進控制循環,以使該循環本質上是(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM