2013-09-29 31 views
0

我現在正在嘗試將更新檢查模塊添加到我的程序中。該方法正在處理更新信息的網站。但在某些情況下,該網站不可訪問,並且該程序在0.5秒內停止檢查。爲了使這成爲可能,我寫了這些代碼:如何在java中使用Object.wait(long)?

int[] lock = new int[0]; 
boolean fileListGot = false; 

Thread downloadFile = new Thread() { 
    public void run() { 
     synchronized (lock) { 
      fileList = HttpFetcher.fetch("http://*****/****"); 
      fileListGot = true; 
      lock.notify(); 
     } 
    } 
}; 

synchronized (lock) { 
    downloadFile.start(); 
    lock.wait(500); 
} 

return fileListGot; 

但是程序不會在0.5秒後停止。該計劃有什麼問題?以及如何使用Object.wait(long)?

+2

有你在開始閱讀它的javadoc? –

+0

http://stackoverflow.com/questions/2275443/how-to-timeout-a-thread – isnot2bad

+0

可能是你忘了「downloadFile.start()」... ... 沒有這個,你的新線程將不會啓動。 –

回答

1

閱讀Object.notify的javadoc - 的重要組成部分,是「被喚醒的線程將無法繼續進行,直到當前線程放棄此對象的鎖。」

主線程獲取的lock顯示器。它啓動工作線程。工作者線程試圖獲得lock的顯示器,但不能。主線程然後調用lock.wait(500),因此丟失顯示器。工作線程然後獲得監視器並繼續。如果下載在500ms後仍在繼續,等待返回並且主線程嘗試獲取監視器,但它仍然屬於工作線程。

下載文件時,您無需握住顯示器,變異的共享變量,只有當 - 試試這個,而不是

public void run() { 
    T temp = HttpFetcher.fetch("http://*****/****"); 
    synchronized (lock) { 
     fileList = temp; 
     fileListGot = true; 
     lock.notify(); 
    } 
} 

其中T是適當類型的fileList

+0

你是對的!但我不同意你的解決方案。儘管它會導致方法在500毫秒後返回,但它不會中止提取操作本身。所以我會建議使用類似的東西:http://jcip.net.s3-website-us-east-1.amazonaws.com/listings/TimedRun.java – isnot2bad

0

您輸入synchronized block然後啓動一個線程。線程的運行嘗試輸入同步塊並永遠等待,因爲您已經從另一個線程獲取了同一個鎖。

downloadFile.start()遠離同步塊。

相關問題