I studied very intensively for over a month, possibly two. I read K&B, took all their chapter exams (mostly at Starbucks). I tried to answer lots of SCJP forum questions that were complex and therefore taught me new details. I took lots and lots of mock exams, including mastering the Rules Roundup. I took most of Dan Chisholm's 20 exams, which are much harder than real exam questions. I learned something new from my mistakes on every Chisholm exam I took. Marcus Green's exams were very helpful, and of course the exams that came with K&B were great because they teach you the format of the real exam. I also took various other mock exams, some easy, some very hard.
I made sure I was well rested, well fed, hydrated, and had used the bathroom before my real exam started.
On my first pass through the exam, I answered every question, and checked the Mark button for every question that I had any hesitation about at all, which was about 20 of them. The first pass took about 1 hour. Then I used the second hour to go through all the questions I had marked, gradually removing the Mark condition from each one as I convinced myself that I had the right answer. (Started getting hungry at this point, but pressed on.)
On one question I simply couldn't decide between 2 answers because I just didn't know whether thread priorities were guaranteed to dictate execution order, or whether they were merely likely to guide execution order. I guessed that they were not guaranteed, which must have been wrong, since my score report says my one wrong answer was a thread question.
After the second pass, where I removed the Marks, I did one very quick pass just to count the answers I'd selected on each question, since I had a bad habit of occasionally giving the wrong number of answers on mock exam.
With about 30 minutes left, I figured I was finished, but there was no harm in proofreading a little, so I did one last pass where I skimmed the questions and answers to see if I'd catch anything new now that I was very familiar with the test. I finished that pass with 6 minutes to go, and ended the test.
Rule of thumb: At any given time, the highest priority thread is running. However, this is not guaranteed. The thread scheduler may choose to run a lower priority thread to avoid starvation. For this reason, use thread priority only to affect scheduling policy for efficiency purposes. Do not rely on it for algorithm correctness.
And the Java 5.0 vm documentation says:
The Thread.setPriority and Thread.yield methods are advisory. They constitute hints from the application to the JVM. Properly written, robust, platform-independent code can use setPriority() and yield() to optimize the performance of the application, but should not depend on these attributes for correctness. Likewise, no assumptions should be made about the order in which threads are granted ownership of a monitor or the order in which threads wake in response to the notify or notifyAll method. An excellent reference for these topics is Chapter 9, "Threads," in Joshua Bloch's book Effective Java Programming Language Guide.
[ June 10, 2005: Message edited by: Barry Gaunt ]