gpt4 book ai didi

java - 为什么ThreadLocal的initialValue不会增加我的变量?

转载 作者:行者123 更新时间:2023-12-03 13:02:00 26 4
gpt4 key购买 nike

我正在学习多线程;并且我有以下ThreadID类:

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 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类:
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) {
}
}
问题:
我想要的是给每个线程一个 ID;我发现当我在线程构造函数中初始化 id时,该值始终为 0(通常 initialValue应该使 nextID递增)
la thread =1 myid= 0
la thread =3 myid= 0
la thread =2 myid= 0
但是当我在 id函数中初始化 Run时,它起作用了!
la thread =1 myid= 1
la thread =3 myid= 3
la thread =2 myid= 2
谁能解释为什么会这样?

最佳答案

What I want is to give each Thread an ID I found that when I init theid in the thread constructor the value is always 0 (normally theinitialValue should increment the nextID)


因此,在 MyThread1类构造函数中,您可以执行以下操作:
public MyThread1(String name) {
tID = new ThreadID();
myid = tID.get();
}
在这种情况下,实际调用 tID.get();的线程是主线程,即从主类调用这些构造函数的线程:
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

but when I init the id inside the Run function it works!


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。每个线程首次调用 tID.get()时将使用一个新的ID。

关于java - 为什么ThreadLocal的initialValue不会增加我的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65698334/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com