package com.threads.status;
public class SynchThread extends Thread {
SynchThread st;
SynchThread(){}
SynchThread(SynchThread s) {
st = s;
}
public void run(){
st.show();
}
synchronized void show(){
for(int i=0;i<5;i++)
//replacing line
System.out.print(Thread.currentThread().getName()+" ");
}
public static void main(String[] args) {
SynchThread s1 = new SynchThread();
Thread t1 = new SynchThread(s1);
Thread t2 = new SynchThread(s1);
s1.setName("t0");
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}
}
Output: t1 t1 t1 t1 t1 t2 t2 t2 t2 t2
When replacing line:
System.out.print(Thread.currentThread().getName()+" ");
Output: t0 t0 t0 t0 t0 t0 t0 t0 t0 t0
Because Thread.currentThread().getName() gets
you the name of the currently-running thread, but getName() resolves to st.getName(), and st is
always your first thread instance.
Why does getName() resolve to st.getName()?
1. During construction of your second through fourth
threads, you pass the first thread in as an argument and save it in the
instance member st.
2. The run method of your threads calls st.show(),
so they're always calling show on the first thread. (If you ever started the
first thread, you'd get an NPE there, since the first thread's st member
is never given a non-null value.)
3. Within show, this is therefore st (the
first thread). Unqualified instance method calls use this as their
instance, and this is the first thread.
No comments:
Post a Comment