关键词搜索

源码搜索 ×
×

阿里TTL异步执行上下文对象传递

发布2017-02-14浏览9091次

详情内容

Github地址:https://github.com/alibaba/transmittable-thread-local


验证对象异步传递示例:

  1. package com.alibaba.ttl.threadpool.agent.demo;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.concurrent.ExecutorService;
  5. import java.util.concurrent.Executors;
  6. import java.util.concurrent.Future;
  7. import java.util.concurrent.TimeUnit;
  8. import com.alibaba.ttl.TransmittableThreadLocal;
  9. public final class AgentDemo {
  10. static TransmittableThreadLocal<String> stringTransmittableThreadLocal = new TransmittableThreadLocal<String>();
  11. static TransmittableThreadLocal<Person> personReferenceTransmittableThreadLocal = new TransmittableThreadLocal<Person>() {
  12. @Override
  13. protected Person initialValue() {
  14. return new Person("unnamed", -1);
  15. }
  16. };
  17. static TransmittableThreadLocal<Person> personCopyTransmittableThreadLocal = new TransmittableThreadLocal<Person>() {
  18. @Override
  19. protected Person copy(Person parentValue) {
  20. // copy value to child thread
  21. return new Person(parentValue.getName(), parentValue.getAge());
  22. }
  23. @Override
  24. protected Person initialValue() {
  25. return new Person("unnamed", -1);
  26. }
  27. };
  28. private AgentDemo() {
  29. throw new InstantiationError( "Must not instantiate this class" );
  30. }
  31. public static void main(String[] args) throws Exception {
  32. ExecutorService executorService = Executors.newFixedThreadPool(3);
  33. expandThreadPool(executorService);
  34. stringTransmittableThreadLocal.set("foo - main");
  35. personReferenceTransmittableThreadLocal.set(new Person("jerry - reference", 1));
  36. personCopyTransmittableThreadLocal.set(new Person("Tom - value", 2));
  37. printTtlInstancesInfo("Main - Before execution of thread pool");
  38. Future<?> submit = executorService.submit(new Runnable() {
  39. @Override
  40. public void run() {
  41. printTtlInstancesInfo("Thread Pool - enter");
  42. stringTransmittableThreadLocal.set("foo - modified in thread pool");
  43. personReferenceTransmittableThreadLocal.get().setName("jerry - reference - modified in thread pool");
  44. personCopyTransmittableThreadLocal.get().setName("Tom - value - modified in thread pool");
  45. printTtlInstancesInfo("Thread Pool - leave");
  46. }
  47. });
  48. submit.get();
  49. printTtlInstancesInfo("Main - After execution of thread pool");
  50. executorService.shutdown();
  51. if (!executorService.awaitTermination(3, TimeUnit.SECONDS)) {
  52. System.exit(1);
  53. }
  54. }
  55. public static void expandThreadPool(ExecutorService executor) throws Exception {
  56. List<Future<?>> ret = new ArrayList<Future<?>>();
  57. for (int i = 0; i < 3; ++i) {
  58. Future<?> submit = executor.submit(new Runnable() {
  59. @Override
  60. public void run() {
  61. try {
  62. Thread.sleep(1000);
  63. } catch (InterruptedException e) {
  64. throw new RuntimeException(e);
  65. }
  66. }
  67. });
  68. ret.add(submit);
  69. }
  70. for (Future<?> future : ret) {
  71. future.get();
  72. }
  73. }
  74. static void printTtlInstancesInfo(String msg) {
  75. System.out.println("====================================================");
  76. System.out.println(msg);
  77. System.out.println("====================================================");
  78. System.out.println("stringTransmittableThreadLocal: " + stringTransmittableThreadLocal.get());
  79. System.out.println("personReferenceTransmittableThreadLocal: " + personReferenceTransmittableThreadLocal.get());
  80. System.out.println("personCopyTransmittableThreadLocal: " + personCopyTransmittableThreadLocal.get());
  81. }
  82. public static class Person {
  83. String name;
  84. int age;
  85. public String getName() {
  86. return name;
  87. }
  88. public void setName(String name) {
  89. this.name = name;
  90. }
  91. public int getAge() {
  92. return age;
  93. }
  94. public void setAge(int age) {
  95. this.age = age;
  96. }
  97. public Person(String name, int age) {
  98. this.name = name;
  99. this.age = age;
  100. }
  101. @Override
  102. public String toString() {
  103. return "Person{" +
  104. "name='" + name + '\'' +
  105. ", age=" + age +
  106. '}';
  107. }
  108. }
  109. }

测试结果:

====================================================
Main - Before execution of thread pool
====================================================
stringTransmittableThreadLocal: foo - main
personReferenceTransmittableThreadLocal: Person{name='jerry - reference', age=1}
personCopyTransmittableThreadLocal: Person{name='Tom - value', age=2}
====================================================
Thread Pool - enter
====================================================
stringTransmittableThreadLocal: null
personReferenceTransmittableThreadLocal: Person{name='unnamed', age=-1}
personCopyTransmittableThreadLocal: Person{name='unnamed', age=-1}
====================================================
Thread Pool - leave
====================================================
stringTransmittableThreadLocal: foo - modified in thread pool
personReferenceTransmittableThreadLocal: 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 - main
personReferenceTransmittableThreadLocal: Person{name='jerry - reference', age=1}
personCopyTransmittableThreadLocal: Person{name='Tom - value', age=2}

分析:

-Before 初始化线程输出

-enter  线程重新设置传递对象的值,但并未提交,所以对象是一个默认的实例输出

-leave submit提交对象修改,对象值被修改传递赋值

-after 输出最终结果


相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载