我有一個Java這樣的代碼:在運行()方法爪哇:拋出異常給另一個線程
private class Uploader implements Runnable
{
// ...
public void start()
{
t.start();
}
public void run()
{
try {
while(i=in.read())
{
output.write(i); // THIS IS A BLOCKING CALL !!
}
} catch(ProtocolException e) { ... }
catch(IOException e1) { ... }
}
private void restore()
{
...
}
private class Checker implements Runnable
{
// ...
@Override
public void run()
{
// I WANT (IN A PARTICULAR MOMENT) TO THROW AN
// EXCEPTION INTO THE Uploader RUN METHOD FROM HERE,
// IS IT POSSIBLE?
}
}
}
的問題是,我有一個阻擋寫(),所以我已經添加了一個 檢查連接是否正在傳輸的新線程:如果它不是傳輸,我想使用異常機制(從檢查器線程拋出異常到另一個線程的run()方法)阻止阻塞write()。 這可能嗎?
EDIT [解決]:
的唯一方法是,以粗暴關閉輸出流,並就寫入的位的量的工作來檢查連接是否正在發送:
private class Uploader implements Runnable
{
private OutputStream output;
private int readedBits;
public void run()
{
try {
while(i=in.read())
{
output.write(i);
readedBits++;
}
} catch(IOException e1)
{
// ENTERS HERE IF RESTORE() IS CALLED
}
}
private void restore()
{
try {
output.close();
} catch (IOException e) {}
// Restore connection ....
}
private int getReadedBits()
{
return this.readedBits;
}
private class Checker implements Runnable
{
// ...
@Override
public void run()
{
while(true)
{
try {
Thread.sleep(timeout);
} catch (InterruptedException e1) {}
if(lastReaded >= getReadedBits())
restore();
else
lastReaded = getReadedBits();
}
}
}
}
只有少數定義明確的「阻止方法」是可中斷的。如果一個線程被中斷,一個標誌被設置,但是除非線程到達這些明確定義的中斷點之一,否則不會發生任何其他事件。就我而言,沒有任何事情發生! –
這就是爲什麼我提出讓你的代碼使用方法,注意中斷。例如,阻止nio允許它。其他選項則是在小阻塞塊中完成您的工作,並在每個塊結束後明確檢查當前線程的中斷狀態。 –