現在我有兩個線程在我的程序中運行。一個人不斷嘗試讀取用戶的輸入,另一個人觀看超時。如果用戶在給定的時間內沒有發送任何輸入,則會發生超時。這兩個線程是這樣的:我應該有專門的線程來觀看超時嗎?
用戶輸入線程
while(true){
if(in.hasNextLine()){
processLine(in.nextLine());
timeLastRecieved = System.currentTimeMillis();
}
}
超時線程
while(true){
//Check for a timout
if(timeLastRecieved+timeoutDuration <= System.currentTimeMillis())
timeUserOut();
else{
//Sleep until it is possible for a timeout to occur
Thread.sleep((timeLastSent+timeoutDuration) - System.currentTimeMillis());
}
}
截至目前我有這些線程分開了,但我可以這樣結合他們...
while(true){
if(in.hasNextLine()){
processLine(in.nextLine());
timeLastRecieved = System.currentTimeMillis();
}
//Check for a timout
if(timeLastRecieved+timeoutDuration <= System.currentTimeMillis())
timeUserOut();
}
但我真的不需要經常檢查超時。所以我應該組合線程並且經常檢查超時,或者我應該有兩個線程。我並不擔心表演,因爲我是正確的編碼禮儀。如果這意味着超過15分鐘的超時時間。
編輯:只想指出,在我睡覺的兩個線程的版本,但在組合版本,我從來沒有睡覺的線程。這顯然會導致檢查超時運行的if語句更加必要。
如果讀線程無論如何都輪詢用戶輸入,它也可以處理超時。畢竟,如果我正確地理解了你,這是等待輸入的超時,因此消費者線程(輪詢)將是超時的。我認爲有一個單獨的線程檢查超時的唯一原因是,如果用戶輸入的處理時間過長,並且例如下一次輪詢將在16分鐘後發生並且用戶在15之後提供輸入: 30兩個輪詢線程都可能無法識別超時。 – Thomas
此外,在處理輸入之前,您可能會考慮放置'timeLastRecieved = System.currentTimeMillis();否則處理所需的時間會增加超時的閾值 - 您可能會也可能不希望發生這種情況。 – Thomas
好點@Thomas。我不必擔心處理的長度,因爲它不應該超過幾毫秒,而超時設置爲大約15分鐘。我的問題的根源在於是否最好有兩個高效的線程,或者一個線程更頻繁地執行if語句,然後是必要的。 – user6629259