美文网首页
TransmittableThreadLocal 测试

TransmittableThreadLocal 测试

作者: 炒面Z | 来源:发表于2022-07-28 13:53 被阅读0次
    
    import com.alibaba.ttl.TransmittableThreadLocal;
    import com.alibaba.ttl.TtlRunnable;
    import com.alibaba.ttl.threadpool.TtlExecutors;
    import lombok.extern.slf4j.Slf4j;
    import org.junit.jupiter.api.Test;
    
    import java.util.Date;
    import java.util.concurrent.Executor;
    import java.util.concurrent.LinkedBlockingQueue;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    /**
     * TransmittableThreadLocal 测试
     */
    @Slf4j
    class TTLest {
    
        @Test
        void test1() throws InterruptedException {
            doTest();
        }
    
        /**
         * TTL 测试
         *
         * @throws InterruptedException
         */
        public void doTest() throws InterruptedException {
            TransmittableThreadLocal<String> context = new TransmittableThreadLocal<>();
    //        ThreadLocal<String> context = new ThreadLocal<>();
    
            // 任务的具体方法
            Runnable runnable = () -> {
                System.out.println("当前任务被执行,执行时间:" + new Date() + " 执行线程:" + Thread.currentThread().getName() + "thread2 父线程数据{}" + context.get());
                context.set("value-set-in-son");
                System.out.println("当前任务被执行,执行时间:" + new Date() + " 执行线程:" + Thread.currentThread().getName() + "thread2 父线程数据{}" + context.get());
                try {
                    // 等待 1s
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            };
            // 创建线程,线程的任务队列的长度为 1
            ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 1,
                    100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(1),
                    new ThreadPoolExecutor.CallerRunsPolicy());
    
            log.error("错误使用方式:1-----------------------------------");
            context.set("value-set-in-parent");
    
            // 添加并执行 4 个任务,模拟拒绝策略CallerRunsPolicy
            threadPool.execute(runnable);
            threadPool.execute(runnable);
            threadPool.execute(runnable);
            threadPool.execute(runnable);
            threadPool.execute(runnable);
            TimeUnit.SECONDS.sleep(5);
    
            log.error("正确使用方式:1-----------------------------------");
            context.set("value-set-in-parent");
    
            // 添加并执行 4 个任务,模拟拒绝策略CallerRunsPolicy
            threadPool.execute(TtlRunnable.get(runnable));
            threadPool.execute(TtlRunnable.get(runnable));
            threadPool.execute(TtlRunnable.get(runnable));
            threadPool.execute(TtlRunnable.get(runnable));
            threadPool.execute(TtlRunnable.get(runnable));
            TimeUnit.SECONDS.sleep(5);
    
            log.error("正确使用方式:2-----------------------------------");
            context.set("value-set-in-parent");
    
            Executor ttlThreadPool = TtlExecutors.getTtlExecutor(threadPool);
            // 添加并执行 4 个任务,模拟拒绝策略CallerRunsPolicy
            ttlThreadPool.execute(runnable);
            ttlThreadPool.execute(runnable);
            ttlThreadPool.execute(runnable);
            ttlThreadPool.execute(runnable);
            ttlThreadPool.execute(runnable);
    
            // 线程池执行完任务,关闭线程池
            threadPool.shutdown();
        }
    }
    
    
    

    相关文章

      网友评论

          本文标题:TransmittableThreadLocal 测试

          本文链接:https://www.haomeiwen.com/subject/gmhxwrtx.html