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