的原因包括J2ME的文檔,我們知道:InterruptedException的
java.lang.InterruptedException當一個線程在等待,睡覺,或以其他方式拋出該異常停頓了很長一段時間,另一個線程中斷了。
問題是如果從一個線程調用Thread.Interpt()獲取此類異常是否可行,而其他線程的Run()方法正在等待InputStream.Read(char [] buf)?
的原因包括J2ME的文檔,我們知道:InterruptedException的
java.lang.InterruptedException當一個線程在等待,睡覺,或以其他方式拋出該異常停頓了很長一段時間,另一個線程中斷了。
問題是如果從一個線程調用Thread.Interpt()獲取此類異常是否可行,而其他線程的Run()方法正在等待InputStream.Read(char [] buf)?
的響應阻塞讀中斷是線程,其實,不確定的行爲。詳情請參閱this long-standing bug。簡而言之,有時候你會得到EOF,有時會得到IOException。
不幸的是,不,java.io.*
類不來打擾他們被阻擋在讀取或寫入方法時作出迴應。通常你要做的就是關閉流,然後處理拋出的IOException
。我有這樣的模式在我的代碼重複:
try {
for (;;) {
try {
inputStream.read(data);
thread.join();
}
catch (IOException exception) {
// If interrupted this isn't a real I/O error.
if (Thread.interrupted()) {
throw new InterruptedException();
}
else {
throw exception;
}
}
}
}
catch (InterruptedException exception) {
}
或者較新的java.nio.*
類做處理中斷更好,產生InterruptedIOException
時候,他們被中斷。請注意,此異常是從IOException
派生,而不是從InterruptedException
所以你可能需要兩個catch
條款處理任何類型的例外,一爲InterruptedException
,一個用於InterruptedIOException
。你會想要任何內部的IOException
catch子句忽略InterruptedIOException
s。
不幸的是方法中斷()在J2ME – Pirks 2009-10-13 17:08:18
這是真的沒有實現,也不在了Thread.interrupt()。那麼你的中斷來自哪裏?是什麼激發了這個問題? – 2009-10-13 17:44:03
通常你不會得到任何東西。 – erickson 2009-10-13 16:44:07
NB長期存在的BUG在2011年得到解決:「這不再是JDK7的問題,因爲傳統的中斷I/O默認情況下,在Solaris上禁用這是從來沒有上的Winodws實現的,而不是一直以來jdk1在Linux上實現的。 3.」 – EJP 2014-11-11 02:26:15