多线程控制类:
ThreadLocal:
用于多个线程需要用到同一个变量,但是每个线程对于这个变量的具体值又不一样,所以利用
ThreadLocal.initialValue()
可以创建副本(即变量的副本),这样每次用的都是同一个变量,但是数值的定义却互不影响,由具体线程决定,因为用的是针对每个线程创建的副本
方法:
- protected T initialValue():
返回此线程局部变量的当前线程的“初始值”(创建一个副本并且返回副本的初始值)。- get() :
返回当前线程的此线程局部变量的副本中的值。- set(T value) :
将当前线程的此线程局部变量的副本设置为指定的值。
创建一个可以实现转账的类:
public class OneThreadLocal {
ThreadLocal<Integer> threadLocal=new ThreadLocal<Integer>(){
@Override
protected Integer initialValue() {
return 0;
}
};
public Integer get(){
return threadLocal.get();
}
public void set(int money){
threadLocal.set(threadLocal.get()+money);
}
}
创建Runnable的实现类:
public class RunnableImpl implements Runnable{
private OneThreadLocal oneThreadLocal=new OneThreadLocal();
private int money;
public RunnableImpl(int money){
this.money=money;
}
@Override
public void run() {
oneThreadLocal.set(money);
System.out.println("线程"+Thread.currentThread().getName()+"....."+oneThreadLocal.get());
}
}
测试类:
创建10 个线程,对其进行set调用,观察每个线程是否互相干扰
import one.RunnableImpl;
public class OneThreadLocalTest {
public static void main(String[] args) {
for (int i=0;i<10;i++){
RunnableImpl runnable=new RunnableImpl(10);
Thread thread=new Thread(runnable);
thread.start();
}
}
}
结果:
线程Thread-0.....10
线程Thread-2.....10
线程Thread-1.....10
线程Thread-3.....10
线程Thread-5.....10
线程Thread-6.....10
线程Thread-7.....10
线程Thread-8.....10
线程Thread-9.....10
线程Thread-4.....10
Process finished with exit code 0
结果可以得知,每个线程对数值的操作都是互相独立的,不会因为上一个线程加了10,下一个线程加10后就变成了20,他们可以操作的变量都相同,但本质是对利用变量ThreadLocal创建的副本进行操作,所以,才不会互相影响