我有一个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允许它。其他选项则是在小阻塞块中完成您的工作,并在每个块结束后明确检查当前线程的中断状态。 –