InheritableThreadID.java
上传用户:songled
上传日期:2022-07-14
资源大小:94k
文件大小:3k
源码类别:

进程与线程

开发平台:

Java

  1. public class InheritableThreadID extends Object {
  2. public static final int UNIQUE  = 101;
  3. public static final int INHERIT = 102;
  4. public static final int SUFFIX  = 103;
  5. private ThreadLocal threadLocal;
  6. private int nextID;
  7. public InheritableThreadID(int type) {
  8. nextID = 201;
  9. switch ( type ) {
  10. case UNIQUE:
  11. threadLocal = new ThreadLocal() {
  12. // override from ThreadLocal
  13. protected Object initialValue() {
  14. print("in initialValue()");
  15. return getNewID();
  16. }
  17. };
  18. break;
  19. case INHERIT:
  20. threadLocal = new InheritableThreadLocal() {
  21. // override from ThreadLocal
  22. protected Object initialValue() {
  23. print("in initialValue()");
  24. return getNewID();
  25. }
  26. };
  27. break;
  28. case SUFFIX:
  29. threadLocal = new InheritableThreadLocal() {
  30. // override from ThreadLocal
  31. protected Object initialValue() {
  32. print("in initialValue()");
  33. return getNewID();
  34. }
  35. // override from InheritableThreadLocal
  36. protected Object childValue(
  37. Object parentValue
  38. ) {
  39. print("in childValue() - " +
  40. "parentValue=" + parentValue);
  41. return parentValue + "-CH";
  42. }
  43. };
  44. break;
  45. default:
  46. break;
  47. }
  48. }
  49. private synchronized String getNewID() {
  50. String id = "ID" + nextID;
  51. nextID++;
  52. return id;
  53. }
  54. public String getID() {
  55. return (String) threadLocal.get();
  56. }
  57. public static void print(String msg) {
  58. String name = Thread.currentThread().getName();
  59. System.out.println(name + ": " + msg);
  60. }
  61. public static Runnable createTarget(InheritableThreadID id) {
  62. final InheritableThreadID var = id;
  63. Runnable parentRun = new Runnable() {
  64. public void run() {
  65. print("var.getID()=" + var.getID());
  66. print("var.getID()=" + var.getID());
  67. print("var.getID()=" + var.getID());
  68. Runnable childRun = new Runnable() {
  69. public void run() {
  70. print("var.getID()=" + var.getID());
  71. print("var.getID()=" + var.getID());
  72. print("var.getID()=" + var.getID());
  73. }
  74. };
  75. Thread parentT = Thread.currentThread();
  76. String parentName = parentT.getName();
  77. print("creating a child thread of " +
  78. parentName);
  79. Thread childT = new Thread(childRun, 
  80. parentName + "-child");
  81. childT.start();
  82. }
  83. };
  84. return parentRun;
  85. }
  86. public static void main(String[] args) {
  87. try {
  88. System.out.println("======= ThreadLocal =======");
  89. InheritableThreadID varA = 
  90. new InheritableThreadID(UNIQUE);
  91. Runnable targetA = createTarget(varA);
  92. Thread threadA = new Thread(targetA, "threadA");
  93. threadA.start();
  94. Thread.sleep(2500);
  95. System.out.println("n======= " +
  96. "InheritableThreadLocal =======");
  97. InheritableThreadID varB = 
  98. new InheritableThreadID(INHERIT);
  99. Runnable targetB = createTarget(varB);
  100. Thread threadB = new Thread(targetB, "threadB");
  101. threadB.start();
  102. Thread.sleep(2500);
  103. System.out.println("n======= " +
  104. "InheritableThreadLocal - custom childValue()" +
  105. " =======");
  106. InheritableThreadID varC = 
  107. new InheritableThreadID(SUFFIX);
  108. Runnable targetC = createTarget(varC);
  109. Thread threadC = new Thread(targetC, "threadC");
  110. threadC.start();
  111. } catch ( InterruptedException x ) {
  112. // ignore
  113. }
  114. }
  115. }