2017-05-29 11 views
0

3秒前に応答が "!"であれば、ポケットを送信しようとしています。その後、通知があります。待機メソッドが動作しない

ただし、「!」を受信すると、waitメソッドが異常終了し、動作を停止します。

スレッド(真)は、この問題を作成し、私は2台のコンピュータ コンピュータ1上でこのコードを実行どのように修正

Test datagram; //its current class 
DatagramSocket ds; 
String adress; 

private final Object monitor = new Object(); 

//send masage 
void send(String str, String adress) throws IOException { 
    synchronized (monitor) { 
     datagram = this; 
     this.adress = adress; 
     ds = new DatagramSocket(3333); 
     DatagramPacket dp = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName(adress), 3333); 
     try { 
      ds.send(dp); 
      receive.start(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
     try { 
      monitor.wait(3000); 
      System.out.println("send"); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Thread receive = new Thread() { 
    public void run() { 
      synchronized (datagram.monitor) { 

      while (true) {//this while make problem 
       DatagramPacket dp = new DatagramPacket(new byte[2048], 2048); 
       try { 
        ds.receive(dp); 
        String data = new String(dp.getData(), 0, dp.getLength()); 
        if (data.equals("!")) { 
         System.out.println(data); 
         this.join(); 
         datagram.monitor.notify(); 
        } else { 
         ds.send(new DatagramPacket("!".getBytes(), 1, InetAddress.getByName(adress), 3333)); 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }; 
}; 

分からないながら:。 新しいテスト()」(サラムを送ります"、" 192.168.1.103 "); コンピュータ2: new Test();

答えて

0

この問題は、手がかりのスレッドがロック気付いていないと発生し

Thread receive = new Thread() { 
    public void run() { 
     while (true) { 
      DatagramPacket dp = new DatagramPacket(new byte[2048], 2048); 
      try { 
       ds.receive(dp); 
       data = new String(dp.getData(), 0, dp.getLength()); 
       if (data.equals("!")) { 
        synchronized (datagram.monitor) { 
         datagram.monitor.notify(); 
        } 
       } else { 
        ds.send(new DatagramPacket("!".getBytes(), 1, InetAddress.getByName(adress), 3333)); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
}; 
関連する問題