Но я не уверен, где мне поставить try and catch, я могу окружить весь синхронизированный блок или только lock.wait ()? Что такое эмпирическое правило и действительно ли оно имеет значение?
lock.wait()
- единственная строка, которая может вызвать исключение в вашем block
методе. Итак, поместите ли вы свой try / catch вокруг ожидания или включите все тело метода, не имеет значения с точки зрения выполнения (при условии, что вы выйдете из цикла в обоих случаях, конечно - если вы хотите продолжить цикл, тогда блок try / catch очевидно, должен быть внутри цикла).
Другими словами, это всего лишь вопрос стиля - см. этот другой обсуждение. Я лично считаю, что это более читабельно:
try {
synchronized (lock) {
while (!loaded) {
lock.wait(); // Unhandled exception type InterruptedException
}
}
} catch (InterruptedException e) {
//to ignore me or not to ignore me, that is the question
Thread.currentThread().interrupt();
}
Можно ли для обработки вызывать Thread.currentThread (). interrupt () в этой ситуации?
В первом примере ниже можно поймать InterruptedException и выйти из цикла без повторного прерывания потока, потому что в любом случае метод run завершится, и поток умрет:
new Thread(new Runnable() {
@Override
public void run() {
block();
}
}).start();
Во втором примере ниже вы обязательно должны повторно прервать поток, чтобы дать методу run знать, была ли причина выхода block()
в том, что загруженный стал истинным или что он был прерван:
public void run() {
while(!Thread.currentThread().isInterrupted()) {
loaded = false;
System.out.println("Launching data load");
block(); //if false has become true, loop, if interrupted, exit
}
}
Если вы не знаете, как будет использоваться метод, хорошие манеры предполагают, что вам следует повторно прервать поток.
person
assylias
schedule
09.01.2013