阿里TTL异步执行上下文对象传递
来源:互联网 发布:免费录屏软件 编辑:程序博客网 时间:2024/05/17 22:36
Github地址:https://github.com/alibaba/transmittable-thread-local
验证对象异步传递示例:
package com.alibaba.ttl.threadpool.agent.demo;import java.util.ArrayList;import java.util.List;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.TimeUnit;import com.alibaba.ttl.TransmittableThreadLocal;public final class AgentDemo { static TransmittableThreadLocal<String> stringTransmittableThreadLocal = new TransmittableThreadLocal<String>(); static TransmittableThreadLocal<Person> personReferenceTransmittableThreadLocal = new TransmittableThreadLocal<Person>() { @Override protected Person initialValue() { return new Person("unnamed", -1); } }; static TransmittableThreadLocal<Person> personCopyTransmittableThreadLocal = new TransmittableThreadLocal<Person>() { @Override protected Person copy(Person parentValue) { // copy value to child thread return new Person(parentValue.getName(), parentValue.getAge()); } @Override protected Person initialValue() { return new Person("unnamed", -1); } }; private AgentDemo() { throw new InstantiationError( "Must not instantiate this class" ); } public static void main(String[] args) throws Exception { ExecutorService executorService = Executors.newFixedThreadPool(3); expandThreadPool(executorService); stringTransmittableThreadLocal.set("foo - main"); personReferenceTransmittableThreadLocal.set(new Person("jerry - reference", 1)); personCopyTransmittableThreadLocal.set(new Person("Tom - value", 2)); printTtlInstancesInfo("Main - Before execution of thread pool"); Future<?> submit = executorService.submit(new Runnable() { @Override public void run() { printTtlInstancesInfo("Thread Pool - enter"); stringTransmittableThreadLocal.set("foo - modified in thread pool"); personReferenceTransmittableThreadLocal.get().setName("jerry - reference - modified in thread pool"); personCopyTransmittableThreadLocal.get().setName("Tom - value - modified in thread pool"); printTtlInstancesInfo("Thread Pool - leave"); } }); submit.get(); printTtlInstancesInfo("Main - After execution of thread pool"); executorService.shutdown(); if (!executorService.awaitTermination(3, TimeUnit.SECONDS)) { System.exit(1); } } public static void expandThreadPool(ExecutorService executor) throws Exception { List<Future<?>> ret = new ArrayList<Future<?>>(); for (int i = 0; i < 3; ++i) { Future<?> submit = executor.submit(new Runnable() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } }); ret.add(submit); } for (Future<?> future : ret) { future.get(); } } static void printTtlInstancesInfo(String msg) { System.out.println("===================================================="); System.out.println(msg); System.out.println("===================================================="); System.out.println("stringTransmittableThreadLocal: " + stringTransmittableThreadLocal.get()); System.out.println("personReferenceTransmittableThreadLocal: " + personReferenceTransmittableThreadLocal.get()); System.out.println("personCopyTransmittableThreadLocal: " + personCopyTransmittableThreadLocal.get()); } public static class Person { String name; int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }}
测试结果:
====================================================Main - Before execution of thread pool====================================================stringTransmittableThreadLocal: foo - mainpersonReferenceTransmittableThreadLocal: Person{name='jerry - reference', age=1}personCopyTransmittableThreadLocal: Person{name='Tom - value', age=2}====================================================Thread Pool - enter====================================================stringTransmittableThreadLocal: nullpersonReferenceTransmittableThreadLocal: Person{name='unnamed', age=-1}personCopyTransmittableThreadLocal: Person{name='unnamed', age=-1}====================================================Thread Pool - leave====================================================stringTransmittableThreadLocal: foo - modified in thread poolpersonReferenceTransmittableThreadLocal: Person{name='jerry - reference - modified in thread pool', age=-1}personCopyTransmittableThreadLocal: Person{name='Tom - value - modified in thread pool', age=-1}====================================================Main - After execution of thread pool====================================================stringTransmittableThreadLocal: foo - mainpersonReferenceTransmittableThreadLocal: Person{name='jerry - reference', age=1}personCopyTransmittableThreadLocal: Person{name='Tom - value', age=2}
分析:
-Before 初始化线程输出
-enter 线程重新设置传递对象的值,但并未提交,所以对象是一个默认的实例输出
-leave submit提交对象修改,对象值被修改传递赋值
-after 输出最终结果
0 0
- 阿里TTL异步执行上下文对象传递
- JavaScript上下文执行对象
- 执行环境和对象上下文
- 执行环境和对象上下文
- dwr 异步传递对象
- JavaScript 执行上下文和变量对象
- JS执行上下文与变量对象
- 函数异步执行,并传递传参
- 执行上下文中的变量对象和活动对象
- 执行上下文
- 执行上下文
- 执行上下文
- 执行上下文
- 执行上下文
- 作用域链(执行上下文) 原型链(对象)
- 执行上下文、变量对象、作用域链、this
- 将函数 fn 的执行上下文改为 obj 对象
- 弄清楚作用域、执行上下文、变量对象、作用域链
- MIT 线性代数(7—9)读书笔记
- Maven系列(二)之安装和配置详解
- Javascript中数据类型&深浅拷贝二
- java进阶week3-3.1
- LoRaWAN协议解析 配套文件 地区参数(物理层)
- 阿里TTL异步执行上下文对象传递
- 白盒测试在西电捷通平台鉴别通用组件PAI中的应用
- Mycat传输层学习分析
- android:contentDescription 的用途
- 献给正在纠结的朋友——转产品还是转测试
- mysql-联表查询
- Android media媒体库分析之:MediaProvider
- 夕拾算法进阶篇:26)哈夫曼树及其编码
- Integer与int的区别