java ThreadLocal 理解

一 ThreadLocal  有什么用

 ThreadLocal并不是一个Thread,而是Thread的局部变量

 ThreadLocal 对多线程提供了另一种思路:给线程产生一个特殊的"局部变量",绑定到线程,随着线程的改变 get()方法得到value也改变。例如在线程1里面用 threadLocal.get()方法,得到的就是线程1的value;线程2里面用 threadLocal.get().get()方法,得到的就是线程2的value。threadLocal.get()倒地得到的value是多少取决于你在哪个线程下用 threadLocal.set(value);

 

public class ThreadLocal1 {
public class ThreadLocal1 {
public String s ;
public static void main(String[] args) throws InterruptedException {
int a=0;
int b=0;
Variable v = new Variable();
Vector<Integer> arrayList = new Vector<>();
// 启动100个线程 并且传入变量
for (int i = 0; i < 100; i++) {
Thread thread = new T1(v,i,i,arrayList);
thread.start();
a=a+i+i;
}

Thread.sleep(1000);
arrayList.sort(null);
for (int i = 0; i < 100; i++) {
b+=arrayList.get(i);
// 输出m方法的返回值
System.out.print(arrayList.get(i)+",");
}

System.out.println();
System.out.println("a的和"+a);
System.out.println("b的和"+b);
}
}
class Variable{
public ThreadLocal<Integer> l1 = new ThreadLocal<>();
public ThreadLocal<Integer> l2 = new ThreadLocal<>();
public int m(){
//System.out.println(l1.get()+l2.get());
return l1.get()+l2.get();
}
}
class T1 extends Thread{
Variable v = null;
int a,b;
Vector<Integer> arrayList = null;
T1(){

}
T1(Variable v,int a ,int b,Vector<Integer> arrayList){
this.v = v;
this.a = a;
this.b=b;
this.arrayList = arrayList;
}
@Override
public void run() {
// 对v对象的值进行 值传递
v.l1.set(new Integer(a));
v.l2.set(new Integer(b));
arrayList.add(v.m());
}
}
String s ; public static void main(String[] args) throws InterruptedException { int a=0; int b=0; Variable v = new Variable(); Vector<Integer> arrayList = new Vector<>(); for (int i = 0; i < 100; i++) { Thread thread = new T1(v,i,i,arrayList); thread.start(); a=a+i+i; } Thread.sleep(1000); arrayList.sort(null); for (int i = 0; i < 100; i++) { b+=arrayList.get(i); System.out.print(arrayList.get(i)+","); } System.out.println(); System.out.println("a的和"+a); System.out.println("b的和"+b); } } class Variable{ public ThreadLocal<Integer> l1 = new ThreadLocal<>(); public ThreadLocal<Integer> l2 = new ThreadLocal<>(); public int m(){ //System.out.println(l1.get()+l2.get()); return l1.get()+l2.get(); } } class T1 extends Thread{ Variable v = null; int a,b; Vector<Integer> arrayList = null; T1(){ } T1(Variable v,int a ,int b,Vector<Integer> arrayList){ this.v = v; this.a = a; this.b=b; this.arrayList = arrayList; } @Override public void run() { v.l1.set(new Integer(a)); v.l2.set(new Integer(b)); System.out.println(Thread.currentThread().getName()); arrayList.add(v.m()); } }

  

猜你喜欢

转载自www.cnblogs.com/wangge01/p/10422750.html