首页 > 编程语言 >JAVA-EE手写ThreadLocal源码实现一个线程一个连接对象------Java-Web项目

JAVA-EE手写ThreadLocal源码实现一个线程一个连接对象------Java-Web项目

时间:2023-10-30 22:32:07浏览次数:40  
标签:Web JAVA Thread ThreadLocal connection 源码 static new public

手写ThreadLocal

package com.bjpowernode.ThreadLocal;

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

public class MyThreadLocal<T>
{
    private Map<Thread,T> map = new HashMap<>();
    public void set(T o)
    {
        //向threadLocal中绑定
        //因为我们一个线程运行的时候,必定在一个栈里面,一定是当前线程
        //所以直接存就可以了
        map.put(Thread.currentThread(),o);
    }
    public T get()
    {
        //从threadLocal中获取
        return map.get(Thread.currentThread());
    }
    public void remove()
    {
        //从threadLocal中删除
        map.remove(Thread.currentThread());
    }
}

ThreadLocal改造工具类

package com.bjpowernode.ThreadLocal;

import java.sql.SQLException;
import java.util.ResourceBundle;

public class DBUtil
{
    private static MyThreadLocal<Connection> local = new MyThreadLocal();
    private static ResourceBundle resourceBundle = ResourceBundle.getBundle("resources.jdbc");
    private static String url = resourceBundle.getString("url");
    private static String username = resourceBundle.getString("user");
    private static String password = resourceBundle.getString("password");
    private static String driver = resourceBundle.getString("driver");
    static
    {
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
    public static Connection getConnection() throws SQLException
    {
        Connection connection = local.get();
        if(connection == null)
        {
            //第一次调用一定是空的
            connection = new Connection();
            //绑定
            local.set(connection);
        }
        return connection;
    }
}

Dao层

package com.bjpowernode.ThreadLocal;

import java.sql.SQLException;

public class UserDao
{
    public void Insert()
    {
//        Thread thread = Thread.currentThread();
//        System.out.println(thread);
        try {
            Connection connection = DBUtil.getConnection();
            System.out.println(connection);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        System.out.println("UserDao添加");
    }
}

Service层

package com.bjpowernode.ThreadLocal;

import java.sql.SQLException;

public class UserService
{
    private UserDao userDao = new UserDao();
    public void Save()
    {
//        Thread thread = Thread.currentThread();
//        System.out.println(thread);
        try {
            Connection connection = DBUtil.getConnection();
            System.out.println(connection);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        userDao.Insert();
        System.out.println("UserService保存");
    }
}

Conn对象

package com.bjpowernode.ThreadLocal;

public class Connection
{

}

测试类

package com.bjpowernode.ThreadLocal;

public class Test
{
    public static void main(String[] args)
    {
        //创建获取Conn对象
//        Thread thread = Thread.currentThread();
//        System.out.println(thread);
//        Connection connection = new Connection();
        UserService userService = new UserService();
        userService.Save();
    }
}

标签:Web,JAVA,Thread,ThreadLocal,connection,源码,static,new,public
From: https://blog.51cto.com/u_16322355/8097422

相关文章

  • CITECT2018R2做WEB发布练习2-安装webserver,配置用户
    这一篇博客我在新浪发表过,地址是CITECT2018R2做WEB发布练习2-安装webserver,配置用户_来自金沙江的小鱼_新浪博客(sina.com.cn)在这里也记录一遍。为了实现citect的web发布功能,需要安装web服务器,我将web服务器和IO服务器、报警服务器等安装在同一台电脑上。需要先安装IIS,这一点......
  • Java 基础篇day03
    流程控制分支结构if和switchif分支根据条件(真或假)来决定执行某段代码点击查看代码if(条件表达式){代码}if(条件表达式){代码1;}else{代码2;}if(条件表达式1){代码1;}elseif(条件表达式2){代码2;}...else{代码n;}switch分支点击查看代码switch(条件......
  • 每日博客——使用Maven对Java独立应用程序进行编译打包
    使用Maven对Java独立应用程序进行编译打包1.安装Maven网盘下载 apache-maven-3.9.2-bin.zip链接为:https://pan.baidu.com/s/181shkgg-i0WEytQMqeeqxA(提取码:9ekc)sudounzip/export/server/apache-maven-3.9.2-bin.zip-d/export/server/cd/export/server/sudomvapac......
  • Java基础 反射获取成员方法
     代码示例:publicstaticvoidmain(String[]args)throwsException{//获取class字节码文件对象Classclazz=Class.forName("pojo.Student");//获取所有的方法(getMethods()还能连着父类的所有的公共方法一起获得,但getDeclaredMethods()不能获取父类里面的方法......
  • WebStorm下载安装-WebStorm中文版下载 中文版介绍
    WebStorm中文版是一款专业的Web前端编程开发软件。WebStorm最新版拥有JavaScript和JavaScript编译语言,支持智能代码提示和代码结构化,为用户提供了高级编码帮助。WebStorm2021软件拥有更精致的外观,还优化了Vue.js的体验,有效的提高了开发人员的工作效率。软件地址:看置顶贴68.烟柳画桥......
  • WebStorm下载-WebStorm官方版下载「电脑版」中文版介绍
    WebStorm简介WebStorm是一个适用于JavaScript和相关技术的集成开发环境。类似于其他JetBrainsIDE,它也会使您的开发体验更有趣,自动执行常规工作并帮助您轻松处理复杂任务。专门针对JavaScript打造是否在为JavaScript开发中最棘手的部分寻找值得信赖的工具10多年来,我们一直......
  • WebStorm 2020下载_WebStorm 2020官方下载 中文版介绍
    webstorm最新版功能1、支持corepack,这是一个实验性的节点js工具;2、允许您在不安装的情况下使用yarn和pnpm;3、webpack编码帮助将使用webpack.config;4、允许您通过单击命令左侧的run图标直接从文件运行这些命令;5、提供列表创建和下拉菜单,允许您选择标题样式,容易格式化md文件。软件地......
  • Java基础之方法
    方法前言1.程序开始执行的时候先从main方法开始2.Java语言中所有的方法体的代码都要遵守从上到下执行3.mian方法程序会自动调用,而main以外的方法需要程序员自己调用。4.main以外的方法只有被调用的时候才会执行什么是方法?为什么使用方法?方法是一个可以重复使用的代码段。而......
  • Java流程控制_01分支结构
    1. if分支  2.switch分支switch可以快速找到某个值,不用一个一个找(底层代码)  ......
  • javaweb学习每日总结-第十天
    第十天学习今天我没有学习什么新的知识,而且回顾我之前所学习的一切的java知识,陷入了思考。一切都是因为今天王建民老师的考试,今天的考试,我取得了相对比较优异的成绩。考试一共一个小时,虽然结果还不错,但是我心里明白,我的技术还相当不熟练,一旦动起手来敲代码,我好像就迷失了方向,我想......