Extending java's ThreadLocal to allow the values to be reset across all threads

前端 未结 3 920
迷失自我
迷失自我 2021-01-23 10:19

After looking at this question, I think I want to wrap ThreadLocal to add a reset behavior.

I want to have something similar to a ThreadLocal, with a method I can call f

3条回答
  •  梦谈多话
    2021-01-23 11:03

    I'm disappointed in the quality of the answers received for this question; I have found my own solution.

    I wrote my test case today, and found the only issue with the code in my question is the Boolean. Boolean is not mutable, so my list of references wasn't doing me any good. I had a look at this question, and changed my code to use AtomicBoolean, and now everything works as expected.

    public class ThreadLocalFlag {
    
        private ThreadLocal flag;
        private List allValues = new ArrayList();
    
        public ThreadLocalFlag() {
            flag = new ThreadLocal() {
                @Override protected AtomicBoolean initialValue() {
                    AtomicBoolean value = new AtomicBoolean();
                    allValues.add(value);
                    return value;
                }
            };
        }
    
        public boolean get() {
            return flag.get().get();
        }
    
        public void set(boolean value) {
            flag.get().set(value);
        }
    
        public void setAll(boolean value) {
            for (AtomicBoolean tlValue : allValues) {
                tlValue.set(value);
            }
        }
    }
    

    Test case:

    public class ThreadLocalFlagTest {
    
        private static ThreadLocalFlag flag = new ThreadLocalFlag();
        private static boolean runThread = true;
    
        @AfterClass
        public static void tearDownOnce() throws Exception {
            runThread = false;
            flag = null;
        }
    
        /**
         * @throws Exception if there is any issue with the test
         */
        @Test
        public void testSetAll() throws Exception {
            startThread("ThreadLocalFlagTest-1", false);
            try {
                Thread.sleep(1000L);
            } catch (InterruptedException e) {
                //ignore
            }
            startThread("ThreadLocalFlagTest-2", true);
            try {
                Thread.sleep(1000L);
            } catch (InterruptedException e) {
                //ignore
            }
            startThread("ThreadLocalFlagTest-3", false);
            try {
                Thread.sleep(1000L);
            } catch (InterruptedException e) {
                //ignore
            }
            startThread("ThreadLocalFlagTest-4", true);
            try {
                Thread.sleep(8000L); //watch the alternating values
            } catch (InterruptedException e) {
                //ignore
            }
            flag.setAll(true);
            try {
                Thread.sleep(8000L); //watch the true values
            } catch (InterruptedException e) {
                //ignore
            }
            flag.setAll(false);
            try {
                Thread.sleep(8000L); //watch the false values
            } catch (InterruptedException e) {
                //ignore
            }
        }
    
        private void startThread(String name, boolean value) {
            Thread t = new Thread(new RunnableCode(value));
            t.setName(name);
            t.start();
        }
    
        class RunnableCode implements Runnable {
    
            private boolean initialValue;
    
            RunnableCode(boolean value) {
                initialValue = value;
            }
    
            @Override
            public void run() {
                flag.set(initialValue);
                while (runThread) {
                    System.out.println(Thread.currentThread().getName() + ": " + flag.get());
                    try {
                        Thread.sleep(4000L);
                    } catch (InterruptedException e) {
                        //ignore
                    }
                }
            }
        }
    }
    

提交回复
热议问题