多线程 - ThreadLocal

来源:互联网 发布:人工智能 企业 编辑:程序博客网 时间:2024/06/05 19:59

ThreadLocal管理Connection


import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * 利用ThreadLocal管理Connection *  * @author ZHEN.L *  */public class ThreadLocalConnection {private static final String DB_URL = "jdbc:mysql://localhost:3306/hxzq1?useUnicode=true&characterEncoding=UTF-8";private static final String DB_USERNAME = "root";private static final String DB_PASSWORD = "123456";private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>();/** * 获取连接 *  * @return */public static Connection getConnection() {Connection conn = null;conn = connectionHolder.get();if (conn == null) {conn = createConnection();connectionHolder.set(conn);}return conn;}// 创建连接private static Connection createConnection() {Connection conn = null;try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}return conn;}public static void main(String[] args) {// 创建线程池ExecutorService pool = Executors.newFixedThreadPool(10);ThreadConnection threadConn = new ThreadConnection();for (int i = 0; i < 10; i++) {pool.execute(threadConn);}pool.shutdown();}}/** * 获取连接 *  * @author ZHEN.L *  */class ThreadConnection implements Runnable {public void run() {Connection conn = ThreadLocalConnection.getConnection();System.out.println(conn);}}


ThreadLocal采用线程封装技术,相当于内部实现了Map<Thread,Object>,为每个线程创建对象的副本


import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ThreadLocalTest {private ThreadLocal<Object> threadLocal = new ThreadLocal<Object>();public void set(Object obj) {threadLocal.set(obj);}public Object get() {return threadLocal.get();}public static void main(String[] args) {ThreadLocalTest t = new ThreadLocalTest();ExecutorService pool = Executors.newFixedThreadPool(10);for (int i = 0; i < 12; i++) {pool.execute(new ThreadTest4(t));}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}for (int i = 0; i < 10; i++) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}pool.execute(new ThreadTest3(t));}pool.shutdown();}}class ThreadTest3 implements Runnable {private ThreadLocalTest threadLocalTest;public ThreadTest3(ThreadLocalTest threadLocalTest) {this.threadLocalTest = threadLocalTest;}public void run() {Object obj = threadLocalTest.get();System.out.println(Thread.currentThread().getName() + ": " + obj);}}class ThreadTest4 implements Runnable {private ThreadLocalTest threadLocalTest;public ThreadTest4(ThreadLocalTest threadLocalTest) {this.threadLocalTest = threadLocalTest;}public void run() {threadLocalTest.set(Thread.currentThread().getName());}}



0 0
原创粉丝点击