0

Следующая программа заканчивается контуром вращения. Я понятия не имею, что может быть причиной. Я был бы более чем счастлив, если бы кто-нибудь мог мне помочь. В следующем коде у меня есть отправитель, который мультивещает некоторые данные получателям группы 224.0.1.20:64. Отправитель ожидает переменную val объекта r и r1 из ThreadManager класс, чтобы отправить данные. И он закрывается после ожидания val1 тех же экземпляров, которые нужно изменить перед выходом. Я пробовал join(), раньше. Но это тоже не сработало. Как показано ниже, отправитель ожидает, что иногда код выполняет корректный вывод, но иногда он просто петли.Программные спины во время многоадресной передачи

package com.test; 

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.InetAddress; 
import java.net.MulticastSocket; 
import java.util.Date; 

public class Test { 
    public static void main(String[] args) throws IOException, InterruptedException { 
     Sender s = new Sender(64); 
     ThreadManager r = new ThreadManager(); 
     ThreadManager r1 = new ThreadManager(); 
     r.start(); 
     r1.start(); 
     //Thread.currentThread().setPriority(1); 
     while(r.val1 != true || r1.val1 != true){ 
        >// I know this is wrong way to wait, but this is just a test 
        >// appln, so I used polling. 
      //Thread.currentThread().sleep(1); 
      //System.out.println(r.val1 || r1.val1); 
     } 
     System.out.println("going to send.."); 
     s.send("kaushik"); 
     while((r.val != true || r1.val != true) || (r.isAlive() && r1.isAlive())){ 
        // same here.. 
      System.out.println(r.val || r.val1); 
      //Thread.sleep(1000); 
     } 
     System.out.println("closing.."); 

    } 
} 
class ThreadManager extends Thread{ 
    public boolean val = false; 
    public boolean val1 = false; 
    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     Reciever r; 
     try { 
      r = new Reciever(64); 

      byte[] buf = new byte[65508]; 
      System.out.println("Going. to be started..."); 
      DatagramPacket packet = new DatagramPacket(buf, 65508); 
    val1 = true; 

      r.recieve(packet); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

      val = true; 
      System.out.println(val+" Id :"+Thread.currentThread().getId()); 


    } 

} 
class Sender{ 
    private MulticastSocket s; 
    public Sender(int port) throws IOException{ 
     s = new MulticastSocket(port); 
     s.joinGroup(InetAddress.getByName("224.0.1.20")); 
    } 
    public void send(String data) throws IOException{ 
     System.out.println("Server"+s.getLocalPort()); 
     DatagramPacket packet = new DatagramPacket(data.getBytes(), data.getBytes().length,InetAddress.getByName("224.0.1.20"),s.getLocalPort()); 
     s.send(packet); 
     System.out.println("server"+s.getRemoteSocketAddress()); 
     s.close(); 
    } 
} 
class Reciever{ 
    private MulticastSocket s; 
    public Reciever(int port) throws IOException{ 
     s = new MulticastSocket(port); 
     s.joinGroup(InetAddress.getByName("224.0.1.20")); 
    } 
    public void recieve(DatagramPacket packet) throws IOException{ 
     s.receive(packet); 
     byte recv[] = new byte[65508]; 
     System.arraycopy(packet.getData(), 0, recv, 0, packet.getData().length); 
     //System.out.println(new String(recv)); 
     System.out.println(new String(recv).trim() + "Date : "+ new Date() + "length :" +new String(recv).trim().length()); 
     s.leaveGroup(InetAddress.getByName("224.0.1.20")); 
     s.close(); 
    } 
} 

Выход:
1. Going. для запуска ...
Going. чтобы начать ...
собирается отправить ..
Server64
servernull
kaushikDate: Вс Июл 26 11:19:09 EST 2014length: 7
правда Id: 9
kaushikDate: ср 26 ноября 11: 19:09 EST 2014length: 7
true Id: 10

** PLS видит, что я устанавливаю val1 и val в true в классе ThreadManager **. В вышеприведенном выводе val1 был установлен как истина для экземпляров r1 и r, но все же программа не прерывается.

+0

Это не тупик. *** заблокировано *** в 'receive()'. Тупик возникает, когда у вас есть круговой шаблон запроса ресурсов. Здесь нет такой вещи. – EJP

+0

@EJP: Иногда «собирается отправить ..» эта строка не печатается, что явно указывает на тупик. В принципе, еще до s.send («kaushik»); вызов, вызывается, возникает взаимоблокировка. –

+0

Не попадая на какую-то строку кода, «явно не указывает на тупик». Это может быть много чего. Вы злоупотребляете этим термином. Поищи это. Если вы все еще думаете, что это тупик, сообщите нам, какие из двух или более блокируемых ресурсов задействованы. – EJP

ответ

2

Это не тупик. UDP Недостоверный, если ваши пакеты потеряны в пути, Reciever будет ждать данных, и это выглядит как «тупик». лучше настроить «тайм-аут» для Reciever.

Здесь вы делитесь r.val1 на главную тему, вам нужно «volatile», чтобы val1 был видимым сразу в основной поток, когда его значение изменилось, volatile также предотвратит агрессивную оптимизацию от JIT или CPU.

public volatile boolean val1 = false; 

быть осторожным с использованием синхронизируется здесь, синхронное (это) не работает, так как это означает, что синхронизируется (г) и синхронизированный (r1), те разные «замок» с. если вы хотите защитить общие переменные в потоках, используйте один и тот же «замок».

+0

Иногда ** «собирается отправить ..» ** эта строка не печатается, что явно указывает на тупик. В принципе, до вызова ** s.send («kaushik»); ** вызова, возникает тупиковая ситуация. –

+0

@KaushikSivaprasad Нет, это означает, что переменные, которые вы тестируете в предыдущем цикле не принимайте значения выхода. – EJP

+0

@EJP: можно усовершенствовать дальше. Thanx заранее. –

 Смежные вопросы

  • Нет связанных вопросов^_^