2013-12-12 19 views
0

如何將while循環放入線程?如何將一個while循環放入一個線程,使用資源嘗試?

public class Weather { 

    public static void main(String[] args) throws UnknownHostException, IOException { 
     String host = "rainmaker.wunderground.com"; 
     int port = 3000; 
     int byteOfData; 
     { 
      try (Socket socket = new Socket(host, port); 
        InputStream inputStream = socket.getInputStream(); 
        OutputStream ouputStream = socket.getOutputStream(); 
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true); 
        final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in))) { 
       //also, a thread for reading from stdin 
       Thread remoteOutputStream = new Thread() { 
        @Override 
        public void run() { 
         //while loop should go here 
         // java.net.SocketException: Socket closed 
         //why does this error occur? 
        } 
       }; 
       remoteOutputStream.start(); 
       while ((byteOfData = inputStream.read()) != -1) { //put into thread 
        out.print((char) byteOfData); 
       } 
      } 
     } 
    } 
} 

當我把while循環進入線程,它只是拋出java.net.SocketException: Socket closed因爲,據推測,如何try with resources works的。但是,我不知道如何使用這種嘗試的線程。

因爲多個線程,一個用於讀取遠程的OutputStream當地的InputStream和一個,似乎有必要把線程注入try,而不是相反..?

回答

2

把整個嘗試資源語句插入線程

final String host = "rainmaker.wunderground.com"; 
final int port = 3000; 

{ 
    Thread remote = new Thread() 
    { 
    @Override public void run() 
    { 
     try (Socket socket = new Socket(host, port); 
      InputStream inputStream = socket.getInputStream(); 
      OutputStream ouputStream = socket.getOutputStream(); 
      PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true); 
      final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in))) 
     { 
     int byteOfData; 

     while ((byteOfData = inputStream.read()) != -1) 
     { //put into thread 
      out.print((char)byteOfData); 
     } 
     } 
    } 
    }; 
    remote.start(); 
+1

doh,我一如既往地提出錯誤的問題。這更有意義,你的方式:)出於好奇,假設這是解決方案,但爲什麼它不起作用? – Thufir

+0

因爲'inputStream'和'byteOfData'在一個單獨的線程中 –

+0

嗯,我最終會變得更糟糕(到目前爲止)。另外,我需要一個線程來讀取一個打開的流,一個線程可以寫入一個打開的流。 – Thufir

2

喜歡的東西(可能需要整理):

public static void main(String[] args) throws UnknownHostException, IOException { 
    String host = "rainmaker.wunderground.com"; 
    int port = 3000; 
    int byteOfData; 
    { 
      //also, a thread for reading from stdin 
      Thread remoteOutputStream = new Thread() { 
       @Override 
       public void run() { 
        try (Socket socket = new Socket(host, port); 
         InputStream inputStream = socket.getInputStream(); 
         OutputStream ouputStream = socket.getOutputStream(); 
         PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true); 
         final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in))) { 
         while ((byteOfData = inputStream.read()) != -1) { //put into thread 
          out.print((char) byteOfData); 
         } 
        } catch (CATCH EXCEPTIONS HERE) { 
         // Handle errors here 
        } 
      }; 
      remoteOutputStream.start(); 
     } 
    } 
} 

如果需要單獨的線程,那麼你會希望像一個BlockingQueue,有一個線程讀取並推入隊列 - 另一個讀取從隊列中拉出並寫入。

我看不出有什麼理由讓你有兩個線程來做到這一點。

+0

一個用於遠程的線程,一個用於本地的線程。然後在線程之間傳遞消息....窮人telnet客戶端。 – Thufir

+0

我收到了大量未報告的異常,並且不知道如何捕捉它們。 – Thufir

+0

如果其中一個是遠程的,那麼它會是一個單獨的程序(或這個的另一個副本),沒有額外的線程 –

相關問題