Core Java Tutorial -- Thread Local 2022-05-28 07:20 80阅读 0赞 Java ThreadLocal 被用于创建线程局部变量。我们知道一个对象的所有线程共享它的变量,所以这个变量不是线程安全的。我们可以为线程安全使用同步,但如果我们像避免同步,我们可以使用 ThreadLocal 变量。 # Java ThreadLocal # 每个线程都有它自己的 ThreadLocal 变量,它们可以使用它的 get() 和 set() 方法来获取默认值或将其值更改 ThreadLocal 实例通常是希望将状态与线程关联的类中的私有静态字段。 ## Java ThreadLocal Example ## 下面是一个小例子,展示了在 Java 程序中使用ThreadLocal 并证明每个线程都有它自己的ThreadLocal 变量副本。 `ThreadLocalExample.java` package Thread; import java.text.SimpleDateFormat; import java.util.Random; public class ThreadLocalExample implements Runnable { // SimpleDateFormat is not thread-safe, so give one to each thread private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>() { @Override protected SimpleDateFormat initialValue() { return new SimpleDateFormat("yyyyMMdd HHmm"); } }; public static void main(String[] args) throws InterruptedException { ThreadLocalExample obj = new ThreadLocalExample(); for (int i = 0; i < 10; i++) { Thread t = new Thread(obj, "" + i); Thread.sleep(new Random().nextInt(1000)); t.start(); } } @Override public void run() { System.out.println("Thread Name= " + Thread.currentThread().getName() + " default Formatter = " + formatter .get().toPattern()); try { Thread.sleep(new Random().nextInt(1000)); } catch (InterruptedException e) { e.printStackTrace(); } //formatter pattern is changed here by thread, but it won't reflect to other threads formatter.set(new SimpleDateFormat()); System.out.println("Thread Name= " + Thread.currentThread().getName() + " formatter = " + formatter.get() .toPattern()); } } 输出: Thread Name= 0 default Formatter = yyyyMMdd HHmm Thread Name= 0 formatter = M/d/yy, h:mm a Thread Name= 1 default Formatter = yyyyMMdd HHmm Thread Name= 2 default Formatter = yyyyMMdd HHmm Thread Name= 2 formatter = M/d/yy, h:mm a Thread Name= 1 formatter = M/d/yy, h:mm a Thread Name= 3 default Formatter = yyyyMMdd HHmm Thread Name= 3 formatter = M/d/yy, h:mm a Thread Name= 4 default Formatter = yyyyMMdd HHmm Thread Name= 4 formatter = M/d/yy, h:mm a Thread Name= 5 default Formatter = yyyyMMdd HHmm Thread Name= 5 formatter = M/d/yy, h:mm a Thread Name= 6 default Formatter = yyyyMMdd HHmm Thread Name= 7 default Formatter = yyyyMMdd HHmm Thread Name= 6 formatter = M/d/yy, h:mm a Thread Name= 8 default Formatter = yyyyMMdd HHmm Thread Name= 8 formatter = M/d/yy, h:mm a Thread Name= 9 default Formatter = yyyyMMdd HHmm Thread Name= 9 formatter = M/d/yy, h:mm a Thread Name= 7 formatter = M/d/yy, h:mm a 从输出中可以看出,Thread-0已经改变了格式化程序的值,但仍然是线程 2 的默认格式化程序与初始化值相同。您也可以看到其他线程的相同模式。 ThreadLocal 类在 Java 8 中用一个新的方法withInitial() 来扩展,该方法将供应商功能接口作为参数。所以我们可以使用 lambda 表达式来轻松创建 ThreadLocal 实例。例如,上面的格式化程序 ThreadLocal 变量可以在一行中定义如下: private static final ThreadLocal<SimpleDateFormat> formatter = ThreadLocal.<SimpleDateFormat>withInitial (() -> { return new SimpleDateFormat("yyyyMMdd HHmm");});
相关 Core Java Tutorial -- Threads in Java Process(进程)和 Thread(线程)是执行的两个基本单元。并发编程更关心 Java 线程 0.1 Process 0.2 Thread 1 Java Thr 叁歲伎倆/ 2022年05月28日 03:49/ 0 赞/ 67 阅读
相关 Core Java Tutorial -- Thread Life Cycle 在使用线程和多线程环境编程时,了解线程生命周期和线程状态非常重要。 1. Thread Life Cycle in Java 1. New 电玩女神/ 2022年05月28日 04:45/ 0 赞/ 70 阅读
相关 Core Java Tutorial -- Thread.sleep() 1. Thread.sleep in Java 1. Java Thread Sleep Example 2. Java Thre 待我称王封你为后i/ 2022年05月28日 05:09/ 0 赞/ 81 阅读
相关 Core Java Tutorial -- Thread Join Java Thread join 方法可用于暂停当前线程执行,直到指定线程死亡。有三个重载 join 函数。 Java Thread join `public f 旧城等待,/ 2022年05月28日 06:14/ 0 赞/ 61 阅读
相关 Core Java Tutorial -- Thread Safety and Java Synchronization Java 中的线程安全是一个重要的主题。Java 提供多线程环境支持 Java 线程,我们知道多线程由同一个 Object 创建共享对象变量,并且当线程用于读取和更新共享数据, 太过爱你忘了你带给我的痛/ 2022年05月28日 06:25/ 0 赞/ 13 阅读
相关 Core Java Tutorial -- Exception in thread main 作为一个 Java 程序员,你必须已经见过有时运行 Java 程序的 main 线程中的异常。 1. Exception in thread main 左手的ㄟ右手/ 2022年05月28日 07:20/ 0 赞/ 71 阅读
相关 Core Java Tutorial -- Daemon Thread Java 中的守护线程可以用于在后台运行一些任务。当我们在 Java 中创建一个线程时,默认情况下它是一个用户线程,如果它正在运行,JVM 将不会终止程序。 Daemon 冷不防/ 2022年05月28日 07:20/ 0 赞/ 62 阅读
相关 Core Java Tutorial -- Thread Local Java ThreadLocal 被用于创建线程局部变量。我们知道一个对象的所有线程共享它的变量,所以这个变量不是线程安全的。我们可以为线程安全使用同步,但如果我们像避免同步, ╰半橙微兮°/ 2022年05月28日 07:20/ 0 赞/ 81 阅读
相关 Core Java Tutorial -- Timer Thread Java `java.util.Timer` 是一个使用程序类,可用于安排将来某个时间执行的线程。Java Timer 类可用于安排一次于运行的任务或定期运行的任务。 Ja ╰+攻爆jí腚メ/ 2022年05月28日 07:20/ 0 赞/ 89 阅读
相关 Core Java Tutorial -- Thread Pool Java 线程池管理工作线程池,它包含一个让任务等待执行的队列。我们可以使用 ThreadPoolExecutor 在 Java 中创建线程池。 Java 线程池管理 Run 淩亂°似流年/ 2022年05月28日 07:21/ 0 赞/ 23 阅读
还没有评论,来说两句吧...