购买网站做友情链接,wordpress中文免费主题,有域名有空间怎么做网站,建设部政务网站1. ThreadLocal的使用方式 (1) 在关联数据类中创建private static ThreadLocal 在下面的类中#xff0c;私有静态 ThreadLocal 实例#xff08;serialNum#xff09;为调用该类的静态 SerialNum.get() 方法的每个 线程维护了一个“序列号”#xff0c;该方法将返回当前… 1. ThreadLocal的使用方式 (1) 在关联数据类中创建private static ThreadLocal 在下面的类中私有静态 ThreadLocal 实例serialNum为调用该类的静态 SerialNum.get() 方法的每个 线程维护了一个“序列号”该方法将返回当前线程的序列号。线程的序列号是在第一次调用 SerialNum.get() 时 分配的并在后续调用中不会更改。 public class SerialNum { // The next serial number to be assigned private static int nextSerialNum 0; private static ThreadLocal serialNum new ThreadLocal() { protected synchronized Object initialValue() { return new Integer(nextSerialNum); } }; public static int get() { return ((Integer) (serialNum.get())).intValue(); } } 另一个例子也是私有静态 ThreadLocal 实例 public class ThreadContext { private String userId; private Long transactionId; private static ThreadLocal threadLocal new ThreadLocal(){ Override protected ThreadContext initialValue() { return new ThreadContext(); } }; public static ThreadContext get() { return threadLocal.get(); } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId userId; } public Long getTransactionId() { return transactionId; } public void setTransactionId(Long transactionId) { this.transactionId transactionId; } } 补充在JDK的API对ThreadLocal私有化的说明。并举例‘线程唯一标识符’ UniqueThreadIdGenerator 大家学习是可以结合官方API来学习。 2. 在Util类中创建ThreadLocal 这是上面用法的扩展即把ThreadLocal的创建放到工具类中。 public class HibernateUtil { private static Log log LogFactory.getLog(HibernateUtil.class); private static final SessionFactory sessionFactory; //定义SessionFactory static { try { // 通过默认配置文件hibernate.cfg.xml创建SessionFactory sessionFactory new Configuration().configure().buildSessionFactory(); } catch (Throwable ex) { log.error(初始化SessionFactory失败, ex); throw new ExceptionInInitializerError(ex); } } //创建线程局部变量session用来保存Hibernate的Session public static final ThreadLocal session new ThreadLocal(); /** * 获取当前线程中的Session * return Session * throws HibernateException */ public static Session currentSession() throws HibernateException { Session s (Session) session.get(); // 如果Session还没有打开则新开一个Session if (s null) { s sessionFactory.openSession(); session.set(s); //将新开的Session保存到线程局部变量中 } return s; } public static void closeSession() throws HibernateException { //获取线程局部变量并强制转换为Session类型 Session s (Session) session.get(); session.set(null); if (s ! null) s.close(); } } 3. 在Runnable中创建ThreadLocal 在线程类内部创建ThreadLocal基本步骤如下 ①、在多线程的类如ThreadDemo类中创建一个ThreadLocal对象threadXxx用来保存线程间 需要隔离处理的对象xxx。 ②、在ThreadDemo类中创建一个获取要隔离访问的数据的方法getXxx()在方法中判断若 ThreadLocal对象为null时候应该new()一个隔离访问类型的对象并强制转换为要应用的类型 ③、在ThreadDemo类的run()方法中通过调用getXxx()方法获取要操作的数据这样可以保证每个线 程对应一个数据对象在任何时刻都操作的是这个对象。 public class ThreadLocalTest implements Runnable{ ThreadLocalStuden studenThreadLocal new ThreadLocalStuden(); Override public void run() { String currentThreadName Thread.currentThread().getName(); System.out.println(currentThreadName is running...); Random random new Random(); int age random.nextInt(100); System.out.println(currentThreadName is set age: age); Studen studen getStudent(); //通过这个方法为每个线程都独立的 new 一个 student 对象每个线程的的
student对象都可以设置不同的值 studen.setAge(age); System.out.println(currentThreadName is first get age: studen.getAge()); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println( currentThreadName is second get age: studen.getAge()); } private Studen getStudent() { Studen studen studenThreadLocal.get(); if (null studen) { studen new Studen(); studenThreadLocal.set(studen); } return studen; } public static void main(String[] args) { ThreadLocalTest t new ThreadLocalTest(); Thread t1 new Thread(t,Thread A); Thread t2 new Thread(t,Thread B); t1.start(); t2.start(); }
}
class Studen{ int age; public int getAge() { return age; } public void setAge(int age) { this.age age; }