As discussed in "Java Threads in the Solaris Environment -- Earlier Releases*", performance is increased dramatically by using native threads. Green threads are not time-sliced and might require calls to Thread.yield() in loops, slowing execution. Other techniques to avoid:
Overuse of synchronization increases the possibility of deadlock (because of coding errors) and increases the likelihood of delays due to lock contention. Also, the overhead of synchronizing might frequently overcome the advantages. Minimizing synchronization takes work, but it pays off well.
Polling: it is acceptable only when waiting for outside events and should be performed in a "side" thread. Use wait()/notify() instead.