[英]Can you interrupt BufferedReader.readLine() with Future.cancel(true)?
假設我開始了一個帖子,我有這樣的事情:
...//initiate all the socket connection
future = executor.submit
( new Runnable()
{ public void run()
{ ...
...
while ((str = in.readLine()) != null)
{ //do something here
}
}
);
executor是一個ExecutorService對象,並且是一個BufferedReader對象
我知道你可以從另一個線程關閉套接字來中斷這個線程。 但是當我嘗試使用future.cancel(true)方法時,即使它返回true,線程似乎仍然在運行,任何人都知道為什么? 或in.readLine()不能以這種方式中斷?
你能用Future.cancel(true)中斷BufferedReader.readLine()嗎?
所有future.cancel(true)
都是在關聯的線程上調用thread.interrupt()
。 這將導致sleep()
和wait()
操作拋出InterruptedException
,並將中斷一些特殊的NIO通道 。
但是很可能你的BufferedReader
不會被中斷,因為它很可能是從“普通”套接字或文件中讀取的。 正如您所提到的,從不同的線程關閉底層套接字是殺死這種IO方法的最佳方法。
您可以關閉in stream以觸發IOException。 否則readLine()可以永遠阻塞。
我已經看過使用JavaLangAccess.blockedOn()但它看起來相當低級別。
readLine
不會拋出InterruptedException
因此如果它運行的線程被InterruptedException
,它將不會受到影響。 您需要顯式檢查線程的中斷狀態:
while ((str = in.readLine()) != null)
{
if (Thread.interrupted()) {
//You can deal with the interruption here
}
}
但是如果它在執行readLine
時阻塞,則中斷它的唯一方法是關閉將引發IOException的底層流。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.