0

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と、おそらく how が原因でスローされますtry with resources works。しかし、この種の試行でスレッドを使用する方法がわかりません。

複数のスレッドが存在するtryため、1 つはローカルの InputStream を読み取るため、もう 1 つはリモートの OutputStream を読み取るためです。

4

2 に答える 2

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のようなものが必要になり、1 つのスレッドを読み取ってキューにプッシュし、もう 1 つのスレッドをキューからプルして書き込みます。

ただし、これを行うために2つのスレッドが必要な理由はわかりません。

于 2013-12-12T09:53:06.113 に答える
2

try with resources ステートメント全体をスレッドに入れます

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();
于 2013-12-12T09:42:44.850 に答える