2011-12-02 87 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允許它。其他選項則是在小阻塞塊中完成您的工作,並在每個塊結束後明確檢查當前線程的中斷狀態。 –