この記事では主に Java での ThreadLocal の正しい使い方に関する関連情報を紹介します。必要な方は Java での ThreadLocal の正しい使い方を参照してください
使い方 1: 関連するデータ クラスにプライベート static
ThreadLocalThreaLocal を作成する JDK ドキュメント状態: ThreadLocal インスタンスは通常、状態をスレッドに関連付けたいクラスのプライベート静的フィールドです。クラスを通じて状態 (ユーザー ID、トランザクション ID など) をスレッドに関連付けたい場合は、通常、プライベート静的型の ThreadLocal インスタンスがこのクラスで定義されます。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(); } }【例】
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; } }
使い方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
オブジェクト
2. ThreadDemo クラスでメソッド getXxx() を作成し、ThreadLocal オブジェクトが null の場合は、分離アクセス型のオブジェクトを new() する必要があると判断します。そして力の変換が適用されるタイプです。
3. ThreadDemo クラスの run() メソッドで、getXxx() メソッドを呼び出して操作対象のデータを取得します。これにより、各スレッドがデータ オブジェクトに対応し、このオブジェクトが常に操作されるようになります。
以上がJavaでThreadLocalを正しく使用するサンプルコード分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。