Если у вас есть запрос улья и время его ожидания, вы можете установить вышеуказанные конфигурации следующим образом:
set mapred.tasktracker.expiry.interval = 1800000;
set mapred.task. время ожидания = 1800000;
Метод ready ()
вызовет исключение при закрытии. Но даже если вы добавили метод закрытой проверки, пока блокировка снимается между вызовами (что для BufferedReader
), читатель может быть закрыт к тому моменту, когда вы его прочтете.
Я вижу три варианта:
BufferedReader
, который расширяет close ()
, чтобы установить ваш собственная переменная, которая
можно использовать, чтобы проверить, закрыт ли считыватель. Это также требует переопределения множества
методы для выполнения любого поведения, которое вы хотите с закрытым читателем, если вы хотите, чтобы он делал что-то помимо исключения IOException
. ready ()
и read ()
в один синхронизированный блок. Я не думаю, что есть какой-либо метод, который вы могли бы вызвать напрямую, чтобы узнать, закрыт ли поток.
Если вам действительно нужно, чтобы два потока использовали этот считыватель, лучшим вариантом может быть чтобы один поток перезвонил другому потоку или установил флаг, чтобы уведомить его о том, что поток был закрыт, чтобы другой поток знал, что не нужно пытаться читать из него.
Если вы уже начали операцию чтения, вы получите уведомление с помощью исключения IOException о том, что поток закрыт. Даже если вы вызывали br.ready () раньше, исключение возникает, когда ваш код блокируется методом чтения.
Этого невозможно избежать. Напротив, вы должны ожидать, что операция чтения вызовет исключение, и будьте готовы обработать его соответствующим образом.
В самом деле, глядя на 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");
}
Другой способ - расширить BufferedReader в вашем собственном классе, переопределив метод close (), чтобы указать, был ли он закрыт.
Если бы только те вещи, которые читают из BufferedReader и закрывают его, являются вашими потоками, я бы просто сделал синхронизированную секцию и установил некоторую плоскую при закрытии Reader. Таким образом, в каждом потоке вы должны:
Просто будьте осторожны и избегайте всего, что может зависнуть в синхронизированном разделе.