Как знать, закрывается ли Поток BufferedReader

Если у вас есть запрос улья и время его ожидания, вы можете установить вышеуказанные конфигурации следующим образом:

set mapred.tasktracker.expiry.interval = 1800000;

set mapred.task. время ожидания = 1800000;

13
задан Dalmas 30 June 2012 в 11:44
поделиться

6 ответов

Метод ready () вызовет исключение при закрытии. Но даже если вы добавили метод закрытой проверки, пока блокировка снимается между вызовами (что для BufferedReader ), читатель может быть закрыт к тому моменту, когда вы его прочтете.

Я вижу три варианта:

  1. Оберните ваш вызов чтения блоком try / catch для обработки закрытого случая.
  2. Создайте подкласс BufferedReader , который расширяет close () , чтобы установить ваш собственная переменная, которая можно использовать, чтобы проверить, закрыт ли считыватель. Это также требует переопределения множества методы для выполнения любого поведения, которое вы хотите с закрытым читателем, если вы хотите, чтобы он делал что-то помимо исключения IOException .
  3. Добавьте собственную блокировку и используйте ее для закрытия читателя (один поток) и проверяем готовность буфера и читаем из него. Вы можете установить переменную непосредственно для проверки или просто сгруппировать вызовы ready () и read () в один синхронизированный блок.
8
ответ дан 2 December 2019 в 01:11
поделиться

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

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

1
ответ дан 2 December 2019 в 01:11
поделиться

Если вы уже начали операцию чтения, вы получите уведомление с помощью исключения IOException о том, что поток закрыт. Даже если вы вызывали br.ready () раньше, исключение возникает, когда ваш код блокируется методом чтения.

Этого невозможно избежать. Напротив, вы должны ожидать, что операция чтения вызовет исключение, и будьте готовы обработать его соответствующим образом.

1
ответ дан 2 December 2019 в 01:11
поделиться

В самом деле, глядя на sureOpen (), он проверяет, не является ли объект в нулевым. Поскольку он является частным, мы не можем получить к нему доступ извне. Но если вам это действительно нужно, вы можете использовать отражение.

 BufferedReader myBR  = new BufferedReader(new FileReader("c:/somefile.txt"));
 myBR.close();

 Class c = myBR.getClass();
 Field in = c.getDeclaredField("in");
 in.setAccessible(true);         
 Object inReader = in.get(myBR);


 if(inReader == null){
     System.out.println("is closed");
 }
 else{
     System.out.println("is open");
 }
0
ответ дан 2 December 2019 в 01:11
поделиться

Другой способ - расширить BufferedReader в вашем собственном классе, переопределив метод close (), чтобы указать, был ли он закрыт.

1
ответ дан 2 December 2019 в 01:11
поделиться

Если бы только те вещи, которые читают из BufferedReader и закрывают его, являются вашими потоками, я бы просто сделал синхронизированную секцию и установил некоторую плоскую при закрытии Reader. Таким образом, в каждом потоке вы должны:

  1. Открыть синхронизированный раздел.
  2. Проверить, не закрыт ли поток (отметьте флаг).
  3. Прочитать из потока.
  4. Закрыть поток.
  5. Установить флаг .
  6. Конец синхронизированного раздела.

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

0
ответ дан 2 December 2019 в 01:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: