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 !!

我有这样一个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()方法中有一个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)。