スレッド間データ伝達の Java ThreadLocal の実装方法
JavaのThreadLocalは一つのスレッド内での異なるメソッド間でデータを共有するために使用できますが、スレッド間のデータ共有には直接使用できません。スレッド間でデータを共有する必要がある場合は、以下のような方法で実現できます。
- ExecutorServiceのsubmit()メソッドでタスクをサブミットする際に、データを渡す場合は引数としてタスクオブジェクトに渡します。
ExecutorService executor = Executors.newFixedThreadPool(10);
ThreadLocal<String> threadLocal = new ThreadLocal<>();
executor.submit(() -> {
threadLocal.set("data");
// 业务逻辑...
String data = threadLocal.get();
// 在这里可以获取到传递的数据
});
- initialValue() メソッドを使用してデータを初期化し、それをスレッドの run() メソッドに渡します。
ThreadLocal<String> threadLocal = new ThreadLocal<String>() {
@Override
protected String initialValue() {
return "data";
}
};
Thread thread = new Thread(() -> {
String data = threadLocal.get();
// 在这里可以获取到传递的数据
});
thread.start();
スレッド間でデータをやり取りする際は、ThreadLocalには一定のリスクがあるので、データの正確性と一貫性を確保する必要があります。また、ThreadLocalを使用する場合は、ThreadLocal内のデータを適宜クリーンアップして、メモリリークを防ぐ必要があることに注意してください。