2011-12-02 57 views
3

我有一个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(); 
      } 
     } 
    } 
} 

回答

0

通常,在I/O上阻塞时,唯一的办法就是关闭资源。正如@VolkerK所说,另一种方法是使用非阻塞I/O,这比较困难。

1

您可以让您的代码兑现Thread.interrupt()致电。看到这个调用的javadoc。

+0

只有少数定义明确的“阻止方法”是可中断的。如果一个线程被中断,一个标志被设置,但是除非线程到达这些明确定义的中断点之一,否则不会发生任何其他事件。就我而言,没有任何事情发生! –

+0

这就是为什么我提出让你的代码使用方法,注意中断。例如,阻止nio允许它。其他选项则是在小阻塞块中完成您的工作,并在每个块结束后明确检查当前线程的中断状态。 –