I have no further comments on the actual spec.
Here's my suggestion for the timed-wait example :)
while (true) {
if (!condition)
wait(timeout, nanos);
else
break; // condition holds
<recompute timeout>
if (timeout <= 0 && !condition)
throw new TimedOutException();
}
// Perform action appropriate to condition
Cheers,
David
On 25/08/2017 11:50 AM, Stuart Marks wrote:
On 8/20/17 6:32 PM, David Holmes wrote:
You're a brave man :)
"It's a dirty job, but somebody's gotta do it." :-)
I have a personal interest in this, as back in the 1.3 days I was trying
to nail down some multi-threaded code, and I found the wait() docs to be
quite lacking. In particular, they didn't cover what happened if a
thread had been interrupted *before* wait was called; they didn't cover
spurious wakeup; and there was no recommendation to call wait() from
within a loop. This last was particularly frustrating because it was
something that "everybody knew" should be done but it wasn't actually
documented. I'm pleased that these issues have been addressed, though
some cleaning up remains -- hence this changeset.
I've made a few more changes and non-changes in response to comments.
1) Added comma in @param timeout in two locations, per Martin.
2) I didn't remove @see links where similar links occurred in the text.
I think it's important that all the wait methods have @see links to both
notify and notifyAll and to the other two methods in the wait family.
3) I left the bullet point "The specified amount of real time has
elapsed, more or less" unchanged, as it seems Martin is still unable to
convince David even after all these years.
4) Restored the sentence about clearing the thread's interrupted status,
in three locations of @throws InterruptedException, per David.
5) I see there was a long discussion about the code snippet. I had to
take some liberties with the logic here, as adding timeout recomputation
pseudo-code as suggested by Hans Boehm clearly begged the question of
what to do with the loop condition if the timeout has elapsed. I rather
sidestepped this by adding a "<timeout not exceeded>" clause in the
while-condition. I think this satisfies Hans' original comment, and it's
not incorrect, but it does leave several of questions unanswered about
how timed-wait logic should be implemented, and how to distinguish
between a timeout and a notification. Martin suggested that I just
proceed with this, and that the examples can be revisited when/if the
TimeUnit.timedWait example is updated. I'm fine with that. I hope
everybody else is too.
Revised webrev:
http://cr.openjdk.java.net/~smarks/reviews/6344935/webrev.2/
Javadoc output:
http://cr.openjdk.java.net/~smarks/reviews/6344935/java/lang/Object.html#wait--
(Note, this is just a single, unstyled HTML file, so the formatting is
somewhat odd. The text of the wait methods should be fairly readable,
though.)
s'marks