📄 threadlocaltest.java
字号:
public class ThreadLocalTest { private static final Object ioLock = new Object(); private static ThreadLocal tl = new ThreadLocal() { protected Object initialValue() { return " TL initial"; } }; private static InheritableThreadLocal itl = new InheritableThreadLocal() { protected Object initialValue() { return "ITL initial"; } protected Object childValue(Object pval) { return (String) pval + " inherited from " + Thread.currentThread().getName(); } }; private static class TestThread extends Thread { private boolean spawn; public TestThread(boolean spawn, String name) { super(name); this.spawn = spawn; //System.out.println("\tThread " + getName() + " created"); } public void run() { for (int k = 0; k < 4; k++) { synchronized (ioLock) { System.out.println(getName()+ " I" +k+ "\t TL: " + ThreadLocalTest.tl.get()); System.out.println(getName()+ " I" +k+ "\tITL: " + ThreadLocalTest.itl.get()); } if (spawn && (k & 1) == 1) { TestThread t1 = new TestThread(false, getName() + "x"); t1.start(); TestThread t2 = new TestThread(false, getName() + "y"); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException ie) { System.err.println("INTERRUPTED, try again."); } } tl.set(tl.get() + " changed by " + getName() + " at k == " + k); itl.set(((k & 1) == 0) ? null : ("set by " + getName() + " at k == " + k)); } } } public static void main(String[] args) { Thread t1, t2; t1 = new TestThread(true, "x"); t2 = new TestThread(true, "y"); t1.start(); t2.start(); // XXX janosvm hack int tries = 0; while (tries < 10) { try { tries++; t1.join(); t2.join(); tries = 20; } catch (InterruptedException ie) { } } }}// Sort output/* Expected Output:x I0 TL: TL initialx I0 ITL: ITL initialx I1 TL: TL initial changed by x at k == 0x I1 ITL: nullx I2 TL: TL initial changed by x at k == 0 changed by x at k == 1x I2 ITL: set by x at k == 1x I3 TL: TL initial changed by x at k == 0 changed by x at k == 1 changed by x at k == 2x I3 ITL: nullxx I0 TL: TL initialxx I0 TL: TL initialxx I0 ITL: null inherited from xxx I0 ITL: null inherited from xxx I1 TL: TL initial changed by xx at k == 0xx I1 TL: TL initial changed by xx at k == 0xx I1 ITL: nullxx I1 ITL: nullxx I2 TL: TL initial changed by xx at k == 0 changed by xx at k == 1xx I2 TL: TL initial changed by xx at k == 0 changed by xx at k == 1xx I2 ITL: set by xx at k == 1xx I2 ITL: set by xx at k == 1xx I3 TL: TL initial changed by xx at k == 0 changed by xx at k == 1 changed by xx at k == 2xx I3 TL: TL initial changed by xx at k == 0 changed by xx at k == 1 changed by xx at k == 2xx I3 ITL: nullxx I3 ITL: nullxy I0 TL: TL initialxy I0 TL: TL initialxy I0 ITL: null inherited from xxy I0 ITL: null inherited from xxy I1 TL: TL initial changed by xy at k == 0xy I1 TL: TL initial changed by xy at k == 0xy I1 ITL: nullxy I1 ITL: nullxy I2 TL: TL initial changed by xy at k == 0 changed by xy at k == 1xy I2 TL: TL initial changed by xy at k == 0 changed by xy at k == 1xy I2 ITL: set by xy at k == 1xy I2 ITL: set by xy at k == 1xy I3 TL: TL initial changed by xy at k == 0 changed by xy at k == 1 changed by xy at k == 2xy I3 TL: TL initial changed by xy at k == 0 changed by xy at k == 1 changed by xy at k == 2xy I3 ITL: nullxy I3 ITL: nully I0 TL: TL initialy I0 ITL: ITL initialy I1 TL: TL initial changed by y at k == 0y I1 ITL: nully I2 TL: TL initial changed by y at k == 0 changed by y at k == 1y I2 ITL: set by y at k == 1y I3 TL: TL initial changed by y at k == 0 changed by y at k == 1 changed by y at k == 2y I3 ITL: nullyx I0 TL: TL initialyx I0 TL: TL initialyx I0 ITL: null inherited from yyx I0 ITL: null inherited from yyx I1 TL: TL initial changed by yx at k == 0yx I1 TL: TL initial changed by yx at k == 0yx I1 ITL: nullyx I1 ITL: nullyx I2 TL: TL initial changed by yx at k == 0 changed by yx at k == 1yx I2 TL: TL initial changed by yx at k == 0 changed by yx at k == 1yx I2 ITL: set by yx at k == 1yx I2 ITL: set by yx at k == 1yx I3 TL: TL initial changed by yx at k == 0 changed by yx at k == 1 changed by yx at k == 2yx I3 TL: TL initial changed by yx at k == 0 changed by yx at k == 1 changed by yx at k == 2yx I3 ITL: nullyx I3 ITL: nullyy I0 TL: TL initialyy I0 TL: TL initialyy I0 ITL: null inherited from yyy I0 ITL: null inherited from yyy I1 TL: TL initial changed by yy at k == 0yy I1 TL: TL initial changed by yy at k == 0yy I1 ITL: nullyy I1 ITL: nullyy I2 TL: TL initial changed by yy at k == 0 changed by yy at k == 1yy I2 TL: TL initial changed by yy at k == 0 changed by yy at k == 1yy I2 ITL: set by yy at k == 1yy I2 ITL: set by yy at k == 1yy I3 TL: TL initial changed by yy at k == 0 changed by yy at k == 1 changed by yy at k == 2yy I3 TL: TL initial changed by yy at k == 0 changed by yy at k == 1 changed by yy at k == 2yy I3 ITL: nullyy I3 ITL: null*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -