大家好,我想請問一個問題,比如
class A{
new Thread(() -> {
int a = 1;
B b = new B();
b.invokeB(a);
});
}
class B{
public void invokeB(int a){
C c = new C();
c.invokeC();
}
}
class C{
public void invokeC(){
//這裡我想用a的值,由於某些原因,不能直接把a傳過來,聽說用ThreadLocal可以實現,但是不太會用,有人能幫我麼,謝謝大家。
}
}
第一,你的代碼有編譯錯誤,A類的那段代碼應該放在代碼塊中,而且new Thread並沒有start所以,沒有運行結果。
首先,你要知道ThreadLocal修飾的成員變量,它修飾類的成員變量,可以獲取當前線程存入的這個變量的副本。
其次,你的C方法,必須能跟這個a練習起來,那麼a必須定義為某個類的ThreadLocal類型的成員變量才能。而且它的訪問也是直接操作這個變量的。
你說的這種需求有點牽強,C類沒有與局部變量a的連接點,不可能得到a的值。而且你的B的invokeB(int a)已經有參數了卻沒有用。
你要真的想這麼用的話,要麼傳遞給C,要麼將a定義為全局靜態共享的變量。
public class A {
public static int a = 1;
public static void main(String[] args) {
new A().invokeA();
}
public void invokeA(){
new Thread(() -> {
//設置當前線程的a的值
B b = new B();
b.invokeB();
}).start();//需要start啟動線程
}
}
class B {
public void invokeB() {
C c = new C();
c.invokeC();
}
}
class C {
public void invokeC() {
// 這裡我想用a的值,由於某些原因,不能直接把a傳過來,聽說用ThreadLocal可以實現,但是不太會用,有人能幫我麼,謝謝大家。
System.out.println(A.a);
}
}