首页 > 其他分享 >自定义实现可跨线程(线程池)的ThreadLocal

自定义实现可跨线程(线程池)的ThreadLocal

时间:2023-08-15 09:28:40浏览次数:33  
标签:自定义 get public ThreadLocal 线程 static MyThreadLocal myThreadLocal

package Test0814;


import com.google.common.collect.Maps;

import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;

public   class MyThreadLocal<T>  extends InheritableThreadLocal<T> {

//方法1 public static final InheritableThreadLocal<MyThreadLocal<Object>> mapThreadLocal=new InheritableThreadLocal<>(); //方法2 public static final Map<Thread,MyThreadLocal<Object>> maps= Maps.newConcurrentMap(); public MyThreadLocal(){ super(); } @Override public void set(T t){ super.set(t);
//set的时候降当前对象存储到map或者threadlocal,然后再实力化包装的runnable的时候,需要拿到当前对象和值 赋给RunnableWrapper ,以便带给任务内的代码获取父线程的值 this.addThis(); maps.put(Thread.currentThread(),(MyThreadLocal<Object>) this); } @Override public T get(){ return super.get(); } private void addThis(){ mapThreadLocal.set((MyThreadLocal<Object>) this); } public static class TransInner{ public static MyThreadLocal<Object> getCap(){ MyThreadLocal<Object> parentLocalMap=mapThreadLocal.get(); return parentLocalMap; } } }
package Test0814;

import java.util.Map;
import java.util.logging.Logger;
// 包装的Runnable,以便将父线程的值传到子线程内
public  class RunableWrapper  implements Runnable {

    private Runnable runnable;
    private Object parentMapValue=null;
    private MyThreadLocal myThreadLocal=MyThreadLocal.maps.get(Thread.currentThread()); //获取父线程的ThreadLocal对象,也可以写在构造器内

    public static RunableWrapper getRunnable(Runnable runnable){
        return new RunableWrapper(runnable);
    }



    public RunableWrapper() {
    }

    public RunableWrapper(Runnable runnable){
         this.runnable=runnable;
         this.parentMapValue=myThreadLocal.get();//获取父对象TTL的值
        // this.parentMapValue=myThreadLocal.get();
        // this.myThreadLocal=myThreadLocal;
    }



    @Override
    public void run() {
       // System.out.println("p="+parentMapValue);
      //  System.out.println("myThreadLocal="+myThreadLocal);
        myThreadLocal.set(parentMapValue); //将父线程的值写入子线程,这样在执行run方法的时候就能获取 父线程的值了
        runnable.run();
        myThreadLocal.remove();//用完后remove 防止内存泄漏
    }
}

 

package Test0814;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @Auther: qint
 * @Date: 2023/08/14 11:15
 * @Description:
 */
public class Main2 {
    private static MyThreadLocal threadLocal = new MyThreadLocal();
    private static ExecutorService ES = Executors.newFixedThreadPool(1);

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            final int a = i;
            ES.submit(() -> {
                        Thread.currentThread().setName("儿子线程" + a);
                        String parentName = Thread.currentThread().getName();
                        threadLocal.set(parentName);
                        System.out.println("儿子线程的ThreadLocal:" + threadLocal.get());
                        ES.submit(RunableWrapper.getRunnable(() -> {
                            Thread.currentThread().setName(parentName + " 的儿子线程");
                            System.out.println(parentName + "的儿子线程的ThreadLocal:" + threadLocal.get());
                        }));
                    }
            );
        }
    }
}

 

标签:自定义,get,public,ThreadLocal,线程,static,MyThreadLocal,myThreadLocal
From: https://www.cnblogs.com/tiancai/p/17630413.html

相关文章

  • 线程
    1、多线程    1.1线程与进程      ·进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序基本单位;系统运行一个程序即是一个进程从创建,运行到消亡的过程。      ·线......
  • java高级之多线程
    1.什么是多线程首先引入程序与进程概念:程序(program)程序是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码(还没有运行起来),静态对象。进程(process)进程是程序的一次执行过程,也就是说程序运行起来了,加载到了内存中,并占用了cpu的资源。这是一个动态的过......
  • 使用线程实现ACB的顺序输出
    在java中可以使用join方法来实现,join会阻塞当前方法,调用的当前方法执行结束后,才会继续往下执行!publicclassFoo{publicFoo(){}publicvoidA(){System.out.println("A");}publicvoidB(){System.out.println("B");}......
  • 创建线程的有哪些方式?创建线程的三种方式的对比?
    ##引言多线程编程是现代软件开发中的重要部分之一。通过利用多线程可以提高程序的并发性和响应能力。在Java中,创建线程的方式有多种,每种方式各有优缺点。本文将介绍创建线程的三种主要方式,并对它们进行比较和对比。继承Thread类继承Thread类是创建线程的一种常见方式。它的特点......
  • elementUi table表格 标头自定义,给表头加点击事件
    <el-table-columnlabel="">  <el-table-columnprop="column":render-header="renderHeader"width="160">    <templateslot-scope="scope">      <span>{{scope.row.column[......
  • 使用vue自定义指令实现按钮权限管理
    原文链接:https://www.jianshu.com/p/f7d6b9420cee官网链接:https://v2.cn.vuejs.org/v2/guide/custom-directive.html注册全局指令Vue提供了一个directive方法给我们注册自定义指令,在main.js中注册一个全局的自定义指令。directive方法接收两个参数:指令名称、包含指令钩子函......
  • 优维低代码实践:自定义模板
    优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。优维低代码实践连载第14期《自定义模板》▽一、概述构件是我们的页面最基......
  • .net中如何证明List<int>是线程非安全的
      我们可以通过以下代码来验证List<int>为何是线程非安全的,执行以下代码,然后查看输出结果。  staticvoidMain(){vartoCount=100;#regionlist线程非安全varlist=newList<int>();//并行添加元素Parallel......
  • 聊聊 Java 虚拟线程
    转载:https://www.modb.pro/db/633787Java虚拟线程(VirtualThreads)是Java平台上的一个新特性,它们是一种轻量级的执行上下文,可以更高效地利用CPU资源,提高程序的并发性能。在本文中,我们将探讨Java虚拟线程的概念、设计原理、使用场景以及与传统线程的比较等方面。什么是Java......
  • 汪文君->多线程教程
    汪文君-多线程教程第一阶段多线程介绍多线程编程入门多线程创建与启动以及线程状态Runnable接口详细详解线程优先级以及守护线程详解线程同步线程间通讯线程组详解自运行对象详解线程异常回调线程池详解等待线程完成任务阻塞io和多线程详解如何优雅的结束线程自定......