Java:向另一个线程抛出异常
我有这样一个java代码:Java:向另一个线程抛出异常,java,exception,throws,Java,Exception,Throws,我有这样一个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 !!
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()方法中有一个blocking write(),所以我添加了一个
检查连接是否正在传输的新线程:如果它没有传输,我想使用异常机制停止阻塞写入()(从检查线程向另一个线程的run()方法抛出异常)。
可能吗
编辑[已解决]:
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();
}
}
}
}
唯一的方法是粗暴地关闭输出流,并计算写入的比特数,以检查连接是否正在传输:
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();
}
}
}
}
您可以让您的代码执行Thread.interrupt()调用。请参阅此调用的javadoc。我建议为此使用中断。检查器可以在上传器类上调用中断 例如
文档在这里:不完全是您要求的,但我宁愿使用和
(不仅仅是)检测超时。通常,在I/O阻塞的情况下,唯一的方法是关闭资源。正如@VolkerK所说,另一种方法是使用非阻塞I/O,这更为困难。只有少数定义良好的“阻塞方法”是可中断的。如果某个线程被中断,则会设置一个标志,但在该线程到达这些定义良好的中断点之一之前,不会发生任何其他情况。就我而言,什么也没发生!这就是为什么我提出让你的代码使用注意中断的方法。例如,阻塞nio允许它。另一个选项是在小的块中工作,并在每个块结束后显式检查当前线程的中断状态。Select似乎不起作用:my write()没有受支持的通道类型(例如java.net.Socket)。