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()方法将其传递给当前线程。我们将看到,如果在两个或者多个不同的线程上调用它,它们的值都将不同。