2015-08-26 45 views
-3

我正在學習Oracle官方輔導頁面的併發性,並且通過一個代碼示例來了解哪裏有一個線程等待4秒來打印元素一個String數組,但同時設置了一個「耐心」變量(一個小時),以防止進程花費超過一個小時的時間中斷線程(儘管這不會發生,因爲字符串數組中只有4個元素相隔4秒的失誤),我的懷疑在於耐心時間的宣告和確認,這是唯一給我帶來麻煩的部分。下面的代碼`如何使用args.length設置最大時間限制Java併發程序

long patience= 1000 * 60 * 60; 

    if (args.length > 0) 
    { 
     try{ 
      patience= Long.parseLong(args[0]); 
     } 

    catch(NumberFormatException e) 
      { 
       threadMessage("Argument must be an integer"); 
      } 
    }` 
+3

您的「懷疑是在聲明和驗證...」。你懷疑什麼?你是什​​麼*問題*? – Andreas

+0

「如何使用args.length來設置最大時間限制」:事實並非如此。你的問題沒有意義。 – EJP

回答

0

耐心宣言: -

long patience= 1000 * 60 * 60; 

上述行宣佈耐心是1小時的默認值。
以上耐心值僅在命令行參數不存在時使用。

if (args.length > 0) 
    { 
     try{ 
      patience= Long.parseLong(args[0]); 
     } 

在上面的代碼中,如果命令行參數存在,則將其分配給耐心。

a)命令行參數以字符串數組的形式傳遞,即參數,所以您檢查數組的長度,如果它的長度大於1,這意味着傳遞了一些參數。
b)因爲命令行參數是一個字符串值,所以您通過使用parseLong(args[0])將其轉換爲long,其中您正在解析數組參數的第一個元素。
c)如果傳遞的參數不能被解析爲一個長整型值,那麼就是拋出NumberFormatException如果您通過abc,則無法將其解析爲長整型值。

Tutorial for passing command line argument to java program

記住Thread類sleep和join方法需要幾毫秒作爲參數,因此您作爲命令行參數提供的值需要以毫秒爲單位。 因此,更好地使用下面的代碼: -

patience = Long.parseLong(args[0]) * 1000; //convert seconds to milliseconds 

驗證: -

兩種方式,通過它可以驗證耐心
1)首先通過耐心< 4秒的較小值,說2秒。約2秒後,您可以立即看到主線程的中斷。通過這種方法獲得以下的輸出:

Output:- 

    main: Starting MessageLoop thread 
    main: Waiting for MessageLoop thread to finish 
    main: Still waiting... 
    main: Still waiting... 
    main: Tired of waiting! 
    Thread-0: I wasn't done! 
    main: Finally! 

2)你可以把消息循環線程1個多小時睡覺,如果你使用的是耐心的默認值。請參閱下面的代碼: -

Thread t = new Thread(new MessageLoop()); 
      Thread.sleep(patience+10000l); 
      t.start(); 
相關問題