On 9 Feb 2001, Juergen Kreileder wrote:
> BTW, it's "Thread.yield()". "Thread.currentThread().yield()" has
> exactly the same meaning but as Thread.yield() is a class method you
> should call it directly on the class.
> "Thread.currentThread().yield()" makes it look like yield() would be
> an instance method.
Yes, but all operations refer to the current thread, and conceptually
refer to the same object. Since java is positioned as a concurrent object
oriented programming language, the class instance (actor) behaves as a
forwarder for the current thread object (actor), and semantically it is
perfectly legal to bypass the forwarding step and be explicit.
Btw, it might be interesting in an smp machine to have the capability to
instruct other threads to yield. The current spec
makes a_thread.yield() meaningless (<any_thread>.yield() ==
Thread.currentThread().yield()). This could be useful in user-space
scheduler implementations and a mixed threading model.
As far as the correctness of yield behavior is concerned you are right
(it does sth the jls correcness criteria and does not violate strong
fairness conditions), but there is definetely sth instructive in the way the
test_yield program behaves. If there is no I/O thread involved, then all
threads get approximately equal run occurences (see test_fairness, attached).
If you run test_yield with a longer sleep period, you'll notice that
there is a dominant thread which gets approx as many runs as the other
two. Although this does not violate the fairness conditions imposed by
the jls, it is not quite what I expect given the perfectly fair behavior
when no i/o is performed. Once again, this is not a bug in the blackdown
vm since it still satisfy the jls, but the behavior of ibm's vm is more
*consistent*.
-- dimitris
mailto:[EMAIL PROTECTED]
public class test_fairness implements Runnable {
int when_;
int run_;
int max_;
static boolean active = true;
test_fairness( int when, int max ) {
when_ = when;
max_ = max;
}
public void run() {
while( active = (run_++ < max_) ) {
for ( int i = 0; i < when_; i++ );
Thread.yield();
}
}
public static void main( String[] args ) throws InterruptedException {
int when = args.length > 0 ?
Integer.parseInt( args[0] ) : 100;
int max = args.length > 1 ?
Integer.parseInt( args[1] ) : 1000000;
test_fairness t1, t2, t3;
Thread th1, th2, th3;
(th1 = new Thread( t1 = new test_fairness( when, max ) )).start();
(th2 = new Thread( t2 = new test_fairness( when, max ) )).start();
(th3 = new Thread( t3 = new test_fairness( when, max ) )).start();
th1.join();
th2.join();
th3.join();
System.out.println( "t1: " + t1.run_
+ " t2: " + t2.run_
+ " t3: " + t3.run_ );
}
}