First off, you may be better off not putting the timer and timer task in the same class as the booking thread.
So when your timer fires, it could call timedOut() one the booking thread and notfiy the client that the booking operation timed out.
The problem here is that on a dead connection,the Socket is blocking and will continue to do so until an IOException is thrown.
You can then define an inner class the extends java.util.TimerTask which can interrupt the booking operating upon firing.
In that case, a RemoteException should be thrown on the call to unlock(). In my implementation, notifyObservers() was called with a value of BOOK_UNLOCK_ERROR. This was considered a warning and not an error since presumably modify() had already been called. I just assumed that the booking was successful and popped up a warning dialog to the user that also stated that the booking had completed.
I just updated the number of seats in the JTable and popped up a dialog to notify the user that the booking had completed sucessfully or failed.
Also, my booking panel kept a set of pending bookings so that if a booking took a long time and the user reselected that record then booking would be disabled.