2014-01-17 2 views
1

Когда другой поток вызывает closeConnection(), поток не достигает Log.d("Subscriber", "Client thread has ended."); Почему это? Что такое блокирующее поведение потока, который был закрыт? Я думал, что попытка написать или флеш к нему приведет к генерации исключения IOException, но, похоже, код все еще блокируется. Где? Я не могу найти информацию о том, что происходит, когда вы прерываете() при записи, или что происходит при записи в закрытый выходной поток.Каково поведение записи закрытого OutputStream? Почему мой поток не заканчивается?

public void closeConnection() { 
     try { 
      this.interrupt(); 
      autoCloseOutputStream.close(); 
     } catch (IOException e) { 
      Log.w("Subscriber", "IOException when closing stream. Buffer might not have been flushed to client."); 
     } 
    } 

    @Override 
    public void run() { 

     Log.d("Subscriber","Client thread has started."); 
     ByteBuffer pgnAndDataBytes=null; 
     while(true) { 
      try { 
       pgnAndDataBytes=fmsByteBufferSubscriberQueue.take(); 
      } catch (InterruptedException e) { 
       break; 
      } 
      Log.d("Subscriber","Still running thread"); 
      try { 
       autoCloseOutputStream.write(pgnAndDataBytes.array()); 
       autoCloseOutputStream.flush(); 
      } catch (IOException e) { 
       break; 
      } 
     } 
     Log.d("Subscriber", "Client thread has ended."); 

    } 

Выход следующим образом:
Тем не менее работает нить
Тем не менее работает нить
Тем не менее работает нить
Закрыть называется.

И ничего более. Где это блокирование и почему?

+0

Кажется, он блокирует в: autoCloseOutputStream.write (pgnAndDataBytes.array()); Как я могу оставить этот метод блокировки? – JohnyTex

ответ

0

Имейте volatile boolean shouldClose, который вы установили на true на closeConnect(). Включите логическое значение в проверку состояния цикла while.

boolean done = false; 
while(!shouldClose && !done) { 
    try{ 
     autoCloseOutputStream.write(pgnAndDataBytes.getInt()); 
    } catch(BufferUnderflowException bue) { 
     final ArrayList<Byte> remainder = new ArrayList<Byte>(3); 
     while(!shouldClose && !done) { 
      try { 
       remainder.add(pgnAndDataBytes.get()); 
      } catch(BufferUnderflowException ex) { 
       autoCloseOutputStream.write(remainder.toArray(new Byte[remainder.size()]); 
       done = true; 
      } 
     } 
    } 
} 
+0

Это не сработает, потому что оно блокируется: autoCloseOutputStream.write (pgnAndDataBytes.array()); (Выход «Still running thread» остановлен) – JohnyTex

+0

@ user2254314 Обновлен мой ответ. – Slynk

+0

@ user2254314 обновлен снова. Больше не блокируется. – Slynk

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