文档章节

ThreadLocal学习----简单例子应用。

绿林小子
 绿林小子
发布于 2015/11/19 09:17
字数 403
阅读 133
收藏 2
点赞 0
评论 0
    1. ThreadLocal的解释,参见
       http://my.oschina.net/u/1989867/blog/528047
    2. ThreadLocal的简单应用:利用ThreadLocal隔离局部变量的特点实现为每个线程提供自己的数据库链接
       ConnectionResource.java ------------------------------------------产生数据库链接的资源类
package com.lxh.ThreadLocal;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

// 资源类
public class ConnectionResource {
	// 属性
	public static String userName = "root";
	public static String userPass = "admin123";
	public static String url = "jdbc:mysql://localhost:3306/user";
	public static String driverName = "com.mysql.jdbc.Driver";
	// 获取数据库链接
	public Connection getConnection(){
		Connection conn = null;
		try {
			Class.forName(driverName);
			conn = DriverManager.getConnection(url, userName, userPass);
		} catch (SQLException e) {
			System.out.println("获取数据库链接失败..."+e.getMessage());
		} catch (ClassNotFoundException e) {
			System.out.println("获取数据库加载类失败..."+e.getMessage());
			e.printStackTrace();
		}
		return conn;
	}
}
       ConnectionThread.java   ------------------------------------------模拟多个线程实现多次获取数据库链接
package com.lxh.ThreadLocal;

import java.sql.Connection;

// 
public class ConnectionThread implements Runnable {
	// 
	public ThreadLocal<Connection> tl = new ThreadLocal<Connection>() {
		@Override
		protected Connection initialValue() {
			ConnectionResource cr = new ConnectionResource();
			return cr.getConnection();
		}
	};

	@Override
	public void run() {
		// 链接对象
		Connection conn = null;
		// 循环获取线程的链接对象
		for (int i = 0; i < 5; i++) {
			conn = tl.get();
			System.out.println("***当前线程【" + Thread.currentThread().getName()
					+ "】获取的链接资源:" + conn + "***");
		}
	}

}
       Test.java               ------------------------------------------测试类
package com.lxh.ThreadLocal;

/**
 * 使用ThreadLocal解决多线程问题
 */
public class Test {

	public static void main(String[] args) {

		ConnectionThread ct = new ConnectionThread();

		Thread t0 = new Thread(ct);
		Thread t1 = new Thread(ct);
		Thread t2 = new Thread(ct);
		Thread t3 = new Thread(ct);

		t0.start();
		t1.start();
		t2.start();
		t3.start();
	}
}
    3. 测试结果

    4. 测试结果分析
       我们通过"测试结果"可以清晰地看到,同一个线程,无论请求多少次,其获取到的数据库链接都是一样的,这符合我们的预期----不让同一个线程获取多个数据库链接以减少资源消耗。

© 著作权归作者所有

共有 人打赏支持
绿林小子
粉丝 4
博文 131
码字总数 45566
作品 0
福州
Go调用Java的一个简单例子

由于Java世界里有非常丰富的开源应用模型和轮子,而这些正是Go世界里面最缺乏的东西,所以我首先考虑的就是如何在Go里面调用现有的Java代码。早上写了个简单的Go调用Java的例子,在winxp环境...

qinhui99
2012/06/26
0
12
java学习从入门到精通(原创)--精华【续】

四、 Java应用的运行环境 Java的应用可以简单分为以下几个方面: 1、 Java的桌面应用 桌面应用一般仅仅需要JRE的支持就足够了。 2、 Java Web应用 Java的Web应用至少需要安装JDK和一个web容器...

精华之王
2009/04/12
0
2
Java 8时间和日期API 20例

伴随lambda表达式、streams以及一系列小优化,Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API。Java处理日期、日历和时间的方式一直为社区所诟病,将...

黄梦巍
2015/06/19
0
0
几周内搞定Java的10个方法

不要将Java与JavaScript弄混了,Java的目标是“一次编译,到处调试”(呃,不对,是“到处运行”)。简单来说,就是Java程序可以直接在任何设备上运行。 Java语言是什么? 不管我们是否意识到...

拉偶有所依
2015/03/11
0
0
Java开发学习之三版本简介 java编程

  Java编程语言,在更迭迅速的互联网领域多年屹立不倒,足以得见Java这门语言旺盛的生命力,因此,会有很多想要进入互联网领域的朋友,想要学Java来转行开发。但是,所谓“隔行如隔山”,j...

老男孩Linux培训
06/05
0
0
一个java初学者的心得体验!

学习了一学期的Java课程,觉得是该总结自己的心得体会了。开始学习任何一门课(包括java),兴趣最重要。 还记得我编写的第一个经典程序“Hello Word”。从那时起我已开始走进Java的世界。 当时...

嘿你好夏天
01/12
0
0
mybatis系统学习(一)——jdbc基础和mybatis

mybatis系统学习(一)——jdbc基础和mybatis 说明 这一次我所想要做的事,是系统的学习一下mybatis,结合官网文档以及各种网络资料和以往实践经验。 既然是系统的学,就免不了需要了解他所要...

优惠券活动
05/03
0
0
Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区
05/09
0
0
从程序员走向java架构师的书籍推荐!

作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从。我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想...

欧阳海阳
前天
0
0
学习大数据需要Java基础吗?

近几年,很多人都听到过一个名词“大数据”也有一部分人选择学习了解大数据,那么大数据到底是什么,学习大数据需要有Java基础吗? 推荐一个大数据学习交流群 119599574每天晚上20:10都有一节...

大数据大咖
06/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Boot Admin 2.0开箱体验

概述 在我之前的 《Spring Boot应用监控实战》 一文中,讲述了如何利用 Spring Boot Admin 1.5.X 版本来可视化地监控 Spring Boot 应用。说时迟,那时快,现在 Spring Boot Admin 都更新到 ...

CodeSheep
2分钟前
0
0
Python + Selenium + Chrome 使用代理 auth 的用户名密码授权

米扑代理,全球领导的代理品牌,专注代理行业近十年,提供开放、私密、独享代理,并可免费试用 米扑代理官网:https://proxy.mimvp.com 本文示例,是结合米扑代理的私密、独享、开放代理,专...

sunboy2050
45分钟前
0
0
实现异步有哪些方法

有哪些方法可以实现异步呢? 方式一:java 线程池 示例: @Test public final void test_ThreadPool() throws InterruptedException { ScheduledThreadPoolExecutor scheduledThre......

黄威
今天
1
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
今天
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
今天
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
昨天
1
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
昨天
1
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部