2016-11-21 3 views
0

В целях обучения я реализую UDP с помощью механизмов TCP (чтобы гарантировать безопасную передачу).Застрял в Interation, который защищен семафором

Semaphore Я использую двоичный код, поэтому его sem = new Semaphore(1);. Я использую этот семафор для управления входом для моего sendBuf, который является List, содержащий все пакеты, которые были отправлены, но еще не подтверждены. Поскольку я иногда удаляю пакеты из него, когда я получаю ACK, мне нужно убедиться, что я не перебираю один поток, а другой поток удаляет из него что-то.

Вещь, которая действительно прослушивал меня это:

public void timeoutTask(long seqNum) { 
    System.out.println("Timeout for package with SeqNum " + seqNum 
      + " happened."); 
    timeoutValue *= 2; 
    try { 
     System.out.println("Acquire? in timeouttask"); 
     sem.acquire(); 
     System.out.println("Acquired! in timeouttask"); 
    } catch (InterruptedException e1) { 
     System.out.println("semaphore not acquired"); 
     e1.printStackTrace(); 
    }for (FCpacket packet : sendBuf) { 

     System.out.println("Iterating!"); 
     if (packet.getSeqNum() == seqNum) { 
      System.out.println("Package for seqNum " + seqNum + " found!"); 
      reSendData = packet.getSeqNumBytesAndData(); 
      DatagramPacket reSendPacket = new DatagramPacket(reSendData, 
        reSendData.length, hostaddress, SERVER_PORT); 

      try { 
       clientSocket.send(reSendPacket); 
       System.out.println("Packet with seq " + seqNum 
         + " send again"); 
       packet.setTimestamp(0); 
       startTimer(packet); 
       new ReceiveHandler(reSendData, reSendData.length, 
         clientSocket, rcvData, UDP_PACKET_SIZE, this).run(); 
      } catch (IOException e) { 
       System.out.println("Couldn't send package"); 
       e.printStackTrace(); 
      } 
     } 
    } 
    sem.release(); 
    System.out.println("released! in timeouttask"); 

Консольный вывод дает мне следующее:

Acquire? in timeouttask 

Acquired! in timeouttask 

Iterating! 

Paket for seqNum 1 found! 

Packet with seq 1 send again 

Так он получает семафор, начинает итерацию, он даже посылает пакет, так что теперь это должно быть: Итерация снова («итерация!») ИЛИ освободить семафор. Ничего из этого не происходит, оно просто застряло. Я понятия не имею, почему - какие-то идеи?

+0

Что вы имеете в виду «Я реализую UDP с механизмами TCP» ?? – SZD

+0

только то, что я сказал в скобках. UDP не гарантирует, что пакеты поступают в пункт назначения, TCP проверяет, выполняются ли они, а если не отправляет их снова. – InDaPond

+0

Кажется, что поток wainting в методе run() для входящих пакетов – Javoslaw

ответ

1

Если ReceiveHandler является Thread, он должен быть вызван в качестве

new ReceiveHandler(reSendData, reSendData.length, clientSocket, rcvData, UDP_PACKET_SIZE, this).start(); 

Но если это Runnable, он должен быть вызван в качестве

new Thread(new ReceiveHandler(reSendData, reSendData.length, clientSocket, rcvData, UDP_PACKET_SIZE, this)).start(); 

run() не будет выполнять задачу в отдельном Нить.

см: What's the difference between Thread start() and Runnable run()

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

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