簡體   English   中英

為什么 ThreadLocal 的 initialValue 不增加我的變量?

[英]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()將生成一個新ID0 ,因為這是任何線程第一次調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM