网站建设与维护ppt模板下载,昆明 网站搭建,sae 网站备案信息,网站开发课程1 ThreadLocal接口出现原因
使用ThreadLocal保存当前线程的变量值#xff0c;这样你想获取该变量的值的时候#xff0c;获取到的都是本线程的变量值#xff0c;不会获取到其他线程设置的值#xff0c;早在JDK 1.2的版本中就提供java.lang.ThreadLocal#xff0c;ThreadLo…1 ThreadLocal接口出现原因
使用ThreadLocal保存当前线程的变量值这样你想获取该变量的值的时候获取到的都是本线程的变量值不会获取到其他线程设置的值早在JDK 1.2的版本中就提供java.lang.ThreadLocalThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序 2 接口主要的API
void set(Object value)设置当前线程的线程局部变量的值。
public Object get()该方法返回当前线程所对应的线程局部变量。
public void remove()将当前线程局部变量的值删除目的是为了减少内存的占用该方法是JDK 5.0新增的方法。需要指出的是当线程结束后对应该线程的局部变量将自动被垃圾回收所以显式调用该方法清除线程的局部变量并不是必须的操作但它可以加快内存回收的速度。
protected Object initialValue()返回该线程局部变量的初始值该方法是一个protected的方法显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法在线程第1次调用get()或set(Object)时才执行并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null。 3 测试Demo
//main method must be in a class Rextester.
//Compiler version 1.8.0_111import java.util.*;
import java.lang.*;class Rextester { //通过匿名内部类覆盖ThreadLocal的initialValue()方法指定初始值 private static ThreadLocalInteger tLocal new ThreadLocalInteger() { public Integer initialValue() { return 0; } }; //获取下一个序列值 public int getNextNum() { tLocal.set(tLocal.get() 1); return tLocal.get(); } public static void main(String args[]) {Rextester rt new Rextester(); // 3个线程共享rtTestClient t1 new TestClient(rt); TestClient t2 new TestClient(rt); TestClient t3 new TestClient(rt); t1.start(); t2.start(); t3.start(); }private static class TestClient extends Thread { private Rextester rt; public TestClient(Rextester rt) { this.rt rt; } public void run() { for (int i 0; i 3; i) { // 每个线程打出3个序列值 System.out.println(thread[ Thread.currentThread().getName() ] -- rt[ rt.getNextNum() ]); } } }
} 4 运行结果
thread[Thread-0] -- rt[1]
thread[Thread-2] -- rt[1]
thread[Thread-1] -- rt[1]
thread[Thread-0] -- rt[2]
thread[Thread-1] -- rt[2]
thread[Thread-0] -- rt[3]
thread[Thread-2] -- rt[2]
thread[Thread-1] -- rt[3]
thread[Thread-2] -- rt[3]