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 tl = new ThreadLocal() {
@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. 测试结果分析
我们通过"测试结果"可以清晰地看到,同一个线程,无论请求多少次,其获取到的数据库链接都是一样的,这符合我们的预期----不让同一个线程获取多个数据库链接以减少资源消耗。