赞
踩
TransmittableThreadLocal 是 Alibaba 开源框架 transmittable-thread-local 中的一个核心类,它扩展了 Java 的标准 ThreadLocal 类。与标准的 ThreadLocal 不同,TransmittableThreadLocal 的值可以在线程之间传递,尤其是在线程池中的线程复用场景下。
总的来说,TransmittableThreadLocal 是一个强大的工具,用于在线程之间传递数据,特别是在使用线程池等高级并发场景时。然而,使用它时需要谨慎,并确保正确处理其生命周期和线程安全性。
线程之间的值传递验证:
引入依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>
<version>2.14.4</version>
</dependency>
使用方式一:
package chatpter08; import com.alibaba.ttl.TransmittableThreadLocal; import com.alibaba.ttl.TtlRunnable; import com.alibaba.ttl.threadpool.TtlExecutors; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class TestTransmittableThreadLocal02 { public static void main(String[] args) throws InterruptedException { final TransmittableThreadLocal transmittableThreadLocal = new TransmittableThreadLocal(); transmittableThreadLocal.set("aaa"); Runnable runnable = () -> { try { TimeUnit.MILLISECONDS.sleep(100); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println("====" + Thread.currentThread().getId() + "===="); System.out.println(transmittableThreadLocal.get()); }; ExecutorService executorService = Executors.newFixedThreadPool(1); int i = 0; while(Boolean.TRUE) { executorService.execute(TtlRunnable.get(runnable)); transmittableThreadLocal.set(i + "AA"); i ++; } } }
使用方式二:
package chatpter08; import com.alibaba.ttl.TransmittableThreadLocal; import com.alibaba.ttl.threadpool.TtlExecutors; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class TestTransmittableThreadLocal { public static void main(String[] args) throws InterruptedException { final TransmittableThreadLocal transmittableThreadLocal = new TransmittableThreadLocal(); transmittableThreadLocal.set("aaa"); Runnable runnable = () -> { try { TimeUnit.MILLISECONDS.sleep(100); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println("====" + Thread.currentThread().getId() + "===="); System.out.println(transmittableThreadLocal.get()); }; ExecutorService executorService = Executors.newFixedThreadPool(1); ExecutorService ttlExecutorService = TtlExecutors.getTtlExecutorService(executorService); int i = 0; while(Boolean.TRUE) { ttlExecutorService.execute(runnable); transmittableThreadLocal.set(i + "AA"); i ++; } } }
运行结果:
====13==== aaa ====13==== 0AA ====13==== 1AA ====13==== 2AA ====13==== 3AA ====13==== 4AA ====13==== 5AA ====13==== 6AA ====13==== 7AA ====13==== 8AA
通过运行结果可以看到TransmittableThreadLocal具有在在线程之间值传递的功能
在设计上采用了装饰器模型来增强Runnable和Callable等线程任务。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。