But I am not sure where I should put try and catch, I can surround whole synchronized block or only lock.wait()? What is rule of thumb and does it really matter?
lock.wait()
is the only line that can throw an exception in your block
method. So whether you put your try/catch around the wait or include the whole method body does not make a difference from an execution perspective (assuming you exit the loop in both cases of course - if you want to continue looping then the try/catch block should obviously be within the loop).
In other words it is only a matter of style - see this other discussion. I personally think this is more readable:
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();
}
For handling is it okay to call Thread.currentThread().interrupt() in this situation?
In the first example below, it is okay to catch the InterruptedException and exit your loop without re-interrupting the thread, because in any case the run method will exit and the thread will die:
new Thread(new Runnable() {
@Override
public void run() {
block();
}
}).start();
In the second example below, you certainly should re-interrupt the thread to let the run method know whether the reason why block()
exited is that loaded became true or that it got interrupted:
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
}
}
If you don't know how the method will be used, good manners suggest that you should re-interrupt the thread.