ThreadLocal Java示例
时间:2020-02-23 14:34:42 来源:igfitidea点击:
提供一个安全线程,并使用局部线程来实现安全类。存储的数据只能由特定线程访问。
ThreadLocal扩展了对象类,并提供了线程限制,这是局部变量的“一部分”。
创建ThreadLocal变量
ThreadLocal threadLocalExample = new ThreadLocal();
上面代码中ThreadLocal对象的实例化只需要每个线程完成。
就像大多数类一样,一旦有了ThreadLocal的实例,就可以对其调用方法。其中一些方法是:
get():返回此线程局部变量的当前线程副本中的值
initialValue():返回当前线程局部变量的当前线程初始值
remove():从当前线程中删除当前线程局部变量的值
set(T value):将当前线程的当前线程局部变量的副本设置为指定值
有关这些方法的详细信息,请访问原始的Oracle文档。
ThreadLocal实例是类中希望将状态与线程关联的私有静态字段(在大多数情况下)
实施例
public class ThreadLocalExample {
public static class Example implements Runnable {
private ThreadLocal<String> example = new ThreadLocal<String>();
//override the run() method that comes from implementing Runnable class
@Override
public void run() {
try {
System.out.println("Getting values...");
Thread.sleep(2000);
}
catch (InterruptedException e) {
System.out.println(e);
}
example.set("Just a random text that will be displayed before the remove function");
System.out.println("Before remove: " + example.get());
example.remove();
System.out.println("After remove: " + example.get());
}
}
public static void main(String[] args) {
/* EXAMPLE THAT DOES NOT HAVE TO DO ANYTHING WITH THE STATIC CLASS ABOVE main*/
ThreadLocal<String> local = new ThreadLocal<String>();
local.set("First");
System.out.println("Value: " + local.get());
local.set("Second");
System.out.println("Value: " + local.get());
local.remove();
System.out.println("Value: " + local.get());
/* NEW EXAMPLE THAT USES THE STATIC CLASS DECLARED ABOVE main */
Example runnable = new Example();
Thread thread = new Thread(runnable);
thread.start();
}
}
输出
Value: First Value: Second Value: null Getting values... Before remove: Just a random text that will be displayed before the remove function After remove: null
说明
上面的代码展示了两种让它工作的方法:一种是让Runnable对象传递给线程实例,然后重写run()方法,或者我们可以简单地创建一个ThreadLocal实例并设置其值,然后就可以获取或者删除它。从上面的例子可以看出,即使它是同一个变量(*local),它也可以包含不同的值。在第一种情况下,它包含值“first”。在第二种情况下,它包含值“second”。对于另一个实现,我只显示了一个线程。但是,每个线程都是独立的——这意味着,如果我们要创建另一个线程实例,比如thread2,然后start()它,它将独立运行,它将与其他线程实例变量无关。为了检查这一点,可以在静态类中创建一个ThreadLocal实例,然后在重写的run()方法中,生成一个随机数,并使用set()方法将其传递给当前线程。我们将看到,如果在两个或者多个不同的线程上调用它,它们的值都将不同。

