ThreadLocal学习----简单例子应用。
ThreadLocal学习----简单例子应用。
绿林小子 发表于2年前
ThreadLocal学习----简单例子应用。
  • 发表于 2年前
  • 阅读 129
  • 收藏 2
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

摘要: 简单的ThreadLocal应用练习
    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
博文 115
码字总数 45566
×
绿林小子
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: