2017-05-07 14 views
0

私は以下のクラスを持っている:のreadUTFで立ち往生スレッド()

public void run() { 
     while(true) { 
     try { 
      DataInputStream in = new DataInputStream(server.getInputStream()); 

      System.out.println(in.readUTF()); 
      prices.setPriceValues(in.readUTF()); 
      DataOutputStream out = new DataOutputStream(server.getOutputStream()); 
      out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress() 
       + "\nGoodbye!"); 
      //server.close(); 

     }catch(SocketTimeoutException s) { 
      System.out.println("Socket timed out!"); 
      break; 
     }catch(IOException e) { 
      e.printStackTrace(); 
      break; 
     } 
     } 
    } 

すべてがうまく動作しますが、私は私が何を格納したい:

public class Prices { 

    String priceValues; 

    public String getPriceValues() { 
     return priceValues; 
    } 

    public void setPriceValues(String priceValues) { 
     this.priceValues = priceValues; 
    } 
} 

これはSocketServerクラスの私のrun方法であり、任意のクラスによってアクセス可能なようにクライアントから受信する。そこで私はPricesというクラスを作成しました。

しかし、スレッドが次の行に貼り付けます:

prices.setPriceValues(in.readUTF()); 

prices変数がnullではない、と私は、この行を取り出したときにすべてがうまく動作します。

+1

ループのたびに 'DataInputStream'を再作成しないでください。ループの前に作成します。 – EJP

答えて

2
System.out.println(in.readUTF()); 
prices.setPriceValues(in.readUTF()); 

あなたはin.readUTF()を2度呼びます。おそらくあなたが望むものではありません。最初の行を削除するか、結果を変数に格納します。

String s = in.readUTF(); 
System.out.println(s); 
prices.setPriceValues(s); 

同期を行わずに複数のスレッドからフィールドを設定して取得することは、スレッドセーフではありません。

0
System.out.println(in.readUTF()); 
prices.setPriceValues(in.readUTF()); 

結果を変数に格納する必要があります。次に、この変数を使用して印刷したり、任意の操作を行うことができます。

関連する問題