文档章节

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

绿林小子
 绿林小子
发布于 2015/11/19 09:17
字数 403
阅读 133
收藏 2
    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
mybatis系统学习(一)——jdbc基础和mybatis

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

优惠券活动
05/03
0
0
一个java初学者的心得体验!

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

嘿你好夏天
01/12
0
0
Java 8时间和日期API 20例

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

黄梦巍
2015/06/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用...

飞扬青云
31分钟前
1
0
我为什么用GO语言来做区块链?

Go语言现在常常被用来做去中心化系统(decentralised system)。其他类型的公司也都把Go用在产品的核心模块中,并且它在网站开发中也占据了一席之地。 我们在决定做Karachain的时候,考量(b...

HiBlock
37分钟前
1
0
大数据学习脑图以及入门教程!

近些年,大数据的火热可谓是技术人都知道啊,很多人呢,也想学习大数据相关,所以,这里分享几个大数据脑图,希望可以让你清楚明白从哪里入门大数据,知道该学习以及掌握哪些知识点; 大数据...

董黎明
今天
1
0
聊聊redis的监控工具

序 本文主要研究一下redis的监控工具 redis-stat redis-stat是一个比较有名的redis指标可视化的监控工具,采用ruby开发,基于redis的info命令来统计,不影响redis性能。 docker运行 docker r...

go4it
今天
2
0
TypeScript基础入门之高级类型的索引类型(Index types)

转发 TypeScript基础入门之高级类型的索引类型(Index types) 高级类型 索引类型(Index types) 使用索引类型,编译器就能够检查使用了动态属性名的代码。 例如,一个常见的JavaScript模式是从...

durban
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部