2015-04-30 2 views
0

Я пытаюсь создать программу для распределенной системы. На данный момент у меня есть поток для прослушивания подключений, поток для отправки и поток для приема.Работает только в режиме отладки

У меня проблема с подключением клиента, но только при использовании контрольных точек. Я не могу понять проблему вообще !. Я пытался реализовать вещи, чтобы замедлить работу программы, но ничто не работает.

Если вы, ребята, можете взглянуть, я был бы очень благодарен.

public static void main(String[] args) 
 
    { 
 
     System.out.println("Server starting on port 5000"); 
 
     RecievingConnection reciever = new RecievingConnection(5000,0); //Recieving Connection 
 
     reciever.start(); 
 
     SendingConnection sender = new SendingConnection(5001,1); //Sending Connection 
 
     sender.start(); 
 
     
 
     while(true){ 
 
      while(reciever.ready==true){ 
 
      System.out.println("In"); 
 
      nodes first = new nodes(reciever.socket,0); 
 
      System.out.println("Node created"); 
 
      first.start(); 
 
      System.out.println("Client connected on port: " + reciever.socket.getLocalAddress()); 
 
      nodes second = new nodes(sender.socket,1); 
 
      second.start(); 
 
      reciever.ready=false; 
 
      sender.ready=false; 
 
      reciever.connectionComplete=true; 
 
      sender.connectionComplete=true; 
 
      } 
 

 
     } 
 

 
    }

public RecievingConnection(int port, int mode) 
 
    { 
 
     Serverport = port; 
 
     connectionMode = mode; 
 
     try{ 
 
      server = new ServerSocket(port); 
 
      server.setSoTimeout(100000); 
 
     } 
 
     catch(IOException ex) 
 
     { 
 
      System.out.println(ex); 
 
     } 
 
    } 
 
    public void run(){ 
 
      while(true){ 
 
       if(ready == false){ 
 
        try { 
 
         socket = server.accept(); 
 
         ready = true; 
 
         System.out.println("Attempting to connect using port: " + Serverport); 
 
         while(connectionComplete == false){ 
 
          //wait 
 
         } 
 
        } catch (IOException ex) { 
 
         System.out.println(ex); 
 
        }  
 
       } 
 

 
      } 
 
     }

Передающий поток в основном тот же код. Любая идея, в чем проблема? «Узлы» - это поток для каждого узла.

+0

Кажется, вам нужна правильная синхронизация между вашими нитями. В качестве отправной точки я предлагаю учебник по потоковому использованию Oracle. –

+0

Будет ли поток ждать, пока основной поток не сообщит об этом после создания узлов? –

ответ

0

Ваша проблема почти наверняка на:

while (connectionComplete == false) { 
     //wait 
    } 

Это будет петля навсегда, другие thtreads не получат процессорного времени на всех. Это также объясняет, почему он работает в отладке - это потому, что при отладке, если вы остановитесь на точке останова, любые другие потоки получат время.

Вы по крайней мере, должны сделать:

while (connectionComplete == false) { 
     //wait 
     Thread.sleep(0); 
    } 

и, возможно, использовать ряд гораздо больше, чем 0. Это позволит запускать другие thtreads.

Я не предполагаю, что это сделает ваш код работать правильно, но он должен удалить текущую проблему.


После этого есть еще одна плотная петля, которая не позволит никому другому времени потока.

while (true) { 
     if (ready == false) { 

Изменить что:

while (true) { 
     if (ready == false) { 
      // ... 
     } else { 
      // Here too. 
      Thread.sleep(0); 
     } 

    } 
+0

Я пробовал это, все еще зависает и, кажется, никогда не входил в цикл while в основной программе для создания потоков узлов. Я полностью потерялся. Программа основного потока должна изменить «Connectioncomplete» на true после создания узлов. –

+0

@JamieBarnett - см. Мое редактирование. Пожалуйста, постарайтесь понять, почему они останавливают вашу программу. – OldCurmudgeon

+0

Я довольно новичок в java, как вы можете заметить. Я не совсем понимаю, почему это происходит. Я понял, что цикл while будет работать до тех пор, пока условие не будет выполнено, и другие потоки будут выполнять свое действие? Однако ваше решение все-таки исправило. Спасибо –

0

Я решил, добавив сон в основном потоке. Я полагаю, это связано с тем, что основной поток имеет приоритет над дочерними потоками?

+1

Нет, это не так. Возможно, этот поток очистил кеш, чтобы один поток мог прочитать обновленные переменные другого или у вас где-то есть условие гонки. http://en.wikipedia.org/wiki/Race_condition – aalku

0

Вы не можете делиться переменными между потоками. Сделайте их волатильными, синхронизируйте или используйте типы CAS, такие как AtomicBoolean.

Читайте об этом.

https://docs.oracle.com/javase/tutorial/essential/concurrency/interfere.html

http://www.journaldev.com/1061/java-synchronization-and-thread-safety-tutorial-with-examples

https://docs.oracle.com/javase/tutorial/essential/concurrency/atomicvars.html

Помимо "узлов" класса не описаны здесь и классы, как ожидается, начать с прописной буквы.

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