2009-10-09 50 views
3
private String indexPage(URL currentPage) throws IOException { 
    String content = ""; 
    is = currentPage.openStream(); 
    content = new Scanner(is).useDelimiter("\\Z").next(); 
    return content; 
} 

這是我目前正在抓取網頁的功能。一個問題是功能:如何在Java中創建一個函數「可超時」?

content = new Scanner(is).useDelimiter("\\Z").next(); 

如果網頁不回答或需要很長的時間來回答,我的線程只是掛在上述行。如果花費超過5秒的時間來加載完整的流,那麼中止這個函數的最簡單方法是什麼?

在此先感謝!

+0

+1使用「timeoutable」 – Davie 2009-10-09 15:50:30

回答

7

而是用一個單獨的線程守望掙扎,這可能是夠你(雖然不完全解答您的要求),如果你能連接並讀取超時網絡連接,例如:

URL url = new URL("..."); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setConnectTimeout(5000); 
conn.setReadTimeout(10000); 
InputStream is = conn.getInputStream(); 

如果花費超過5秒(5000毫秒),以連接到服務器這個例子將失敗,或者如果你必須等待任何內容塊它們之間大於10秒(10000ms)實際閱讀。但是,它不會限制您需要檢索該頁面的總計時間。

+0

謝謝,那就是我正在尋找的! – ndee 2009-10-09 16:02:28

3

您可以關閉另一個線程的流。

0

嘗試中斷該線程; Java中的許多阻塞調用在接收到中斷時都會繼續。

在這種情況下,content應該是空的,並且Thread.isInterrupted()應該是true

+0

通常I/O不像這樣是可中斷的。 Solaris上的某些版本的Sun JRE用於執行此操作,但我不知道其他任何默認啓用它的其他版本。 – 2009-10-09 16:10:55

3

谷歌最近發佈的guava-libraries有一些類,提供類似的功能:

TimeLimiter

產生強加時間限制的方法調用代理對象代理。例如,返回target.someMethod()的值,但替補DEFAULT_VALUE如果調用此方法接管50毫秒,你可以使用此代碼...