public class TestContext { private static ThreadLocal<TestContext> localContext = new ThreadLocal<>(); private String val; public static void start() { TestContext context = new TestContext(); localContext.set(context); } public static TestContext get() { return localContext.get(); } public static void remove() { localContext.remove(); } public String getVal() { return val; } public void setVal(String val) { this.val = val; } }
public class Test { public static void main(String[] args) throws InterruptedException { Thread thread1 = new Thread(() -> { TestContext.start(); TestContext.get().setVal("val--1"); try { TimeUnit.SECONDS.sleep(8); } catch (InterruptedException e) { e.printStackTrace(); } System.err.println("thread1: " + TestContext.get().getVal()); TestContext.remove(); }); Thread thread2 = new Thread(() -> { TestContext.start(); TestContext.get().setVal("val--2"); try { TimeUnit.SECONDS.sleep(4); } catch (InterruptedException e) { e.printStackTrace(); } System.err.println("thread2: " + TestContext.get().getVal()); TestContext.remove(); }); Thread thread3 = new Thread(() -> { TestContext.start(); TestContext.get().setVal("val--3"); try { TimeUnit.SECONDS.sleep(6); } catch (InterruptedException e) { e.printStackTrace(); } System.err.println("thread3: " + TestContext.get().getVal()); TestContext.remove(); }); thread1.start(); TimeUnit.SECONDS.sleep(1); thread2.start(); TimeUnit.SECONDS.sleep(1); thread3.start(); } }
代码输出:
thread2: val--2
thread1: val--1
thread3: val--3