[英]Why initialValue of ThreadLocal doesn't increment my variables?
我正在學習多線程; 我有以下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);
}
}
以及以下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 ");
}
}
和我的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) {
}
}
題:
我想要的是給每個 Thread 一個ID
; 我發現當我在線程構造函數中初始化id
時,該值始終為0
(通常initialValue
應該遞增nextID
)
la thread =1 myid= 0
la thread =3 myid= 0
la thread =2 myid= 0
但是當我在Run
function 中初始化id
時,它起作用了!
la thread =1 myid= 1
la thread =3 myid= 3
la thread =2 myid= 2
誰能解釋為什么會這樣?
我想要的是給每個線程一個 ID,我發現當我在線程構造函數中初始化 id 時,該值始終為 0(通常 initialValue 應該遞增 nextID)
因此,在MyThread1
class 構造函數中,您執行以下操作:
public MyThread1(String name) {
tID = new ThreadID();
myid = tID.get();
}
在這種情況下,線程實際上調用tID.get();
是主線程,即調用這些構造函數的線程,來自主 class:
MyThread1 TH[] = new MyThread1[10];
for (int i = 0; i < 10; i++)
TH[i] = new MyThread1("nom" + i);
第一次調用tID.get()
將生成一個新ID
為0
,因為這是任何線程第一次調用tID.get()
。 來自同一線程(即主線程)的下一次調用不會生成新的ID
,而是始終返回相同的 ID,在這種情況下,主線程返回0
。
但是當我在 Run function 中初始化 id 時,它起作用了!
在run
方法中:
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 ");
}
tID.get()
將被不同的線程調用,這就是您獲得新 ID 的原因。 每個線程一個新 ID 第一次調用tID.get()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.