I am learning about multithreading; and I have the following ThreadID
class:
public class ThreadID {
private static volatile int nextID=0;
private static class ThreadLocalID extends ThreadLocal<Integer>{
protected synchronized Integer initialValue(){
return nextID ++;
}
}
private static ThreadLocalID threadID =new ThreadLocalID();
public static int get(){
return threadID.get();
}
public static void set (int index){
threadID.set(index);
}
}
and the following Thread
class:
class MyThread1 extends Thread {
int x;
public ThreadID tID;
public int myid;
public MyThread1(String name) {
tID = new ThreadID();
myid = tID.get();
}
public void run() {
System.out.println("la thread =" + tID.get() + " myid= " + myid);
try {
this.sleep(10);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("la thread =" + tID.get() + " apres le sommeil ");
}
}
and my main
Class:
public static void main(String[] args) {
MyThread1 TH[] = new MyThread1[10];
for (int i = 0; i < 10; i++)
TH[i] = new MyThread1("nom" + i);
try {
for (int i = 0; i < 10; i++) TH[i].start();
for (int i = 0; i < 10; i++) TH[i].join();
} catch (InterruptedException e) {
}
}
Question:
What I want is to give each Thread an ID
; I found that when I init the id
in the thread constructor the value is always 0
(normally the initialValue
should increment the nextID
)
la thread =1 myid= 0
la thread =3 myid= 0
la thread =2 myid= 0
but when I init the id
inside the Run
function it works !
la thread =1 myid= 1
la thread =3 myid= 3
la thread =2 myid= 2
Can any one explain why this happens?
Advertisement
Answer
What I want is to give each Thread an ID I found that when I init the id in the thread constructor the value is always 0 (normally the initialValue should increment the nextID)
So in the MyThread1
class constructor you do:
public MyThread1(String name) {
tID = new ThreadID();
myid = tID.get();
}
In this case, the thread actually calling tID.get();
is the main thread, i.e., the thread that is calling those constructors, from the main class:
MyThread1 TH[] = new MyThread1[10];
for (int i = 0; i < 10; i++)
TH[i] = new MyThread1("nom" + i);
The first call to tID.get()
will generate a new ID
as 0
, since it is the first time that any thread is calling tID.get()
. The next calls from the same thread (i.e., main thread) will not generate a new ID
, but instead, it always returns the same ID, in this case, return 0
for the main thread.
but when I init the id inside the Run function it works!
Inside the run
method:
public void run() {
System.out.println("la thread =" + tID.get() + " myid= " + myid);
try {
this.sleep(10);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("la thread =" + tID.get() + " apres le sommeil ");
}
the tID.get()
will be called by different threads, and that is why you get new IDs. One new ID per thread calling for the first time tID.get()
.