package com.dev.test;
public class MyThreadLocal {
/**
* 用于验证threadlocal与inheritableThreadLocal的区别
* @param args
*/
public static void main(String[] args) {
ThreadLocal<String> mainThreadLocal=new ThreadLocal();
System.out.println("------ThreadLocal-------");
mainThreadLocal.set("--main thread set string");
System.out.println("在main线程中threadlocal="+mainThreadLocal.get());
Thread thread1=new Thread(new MyThreadLocal().new ChildThread(mainThreadLocal));
thread1.start();
try {
thread1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("再次获取在main线程中threadlocal="+mainThreadLocal.get());
System.out.println("------ThreadLocal end-------");
System.out.println("总结threadlocal:主线程中设置的threadlocal参数子线程无法获取;");
System.out.println(" 子线程中设置、修改的threadlocal在主线程中也无法获得(针对值引用)");
System.out.println("------InheritableThreadLocal-------");
InheritableThreadLocal<String> mainInheritableThreadLocal=new InheritableThreadLocal();
mainInheritableThreadLocal.set("--main thread set string");
System.out.println("在main线程中InheritableThreadLocal="+mainInheritableThreadLocal.get());
Thread thread2=new Thread(new MyThreadLocal().new ChildThread2(mainInheritableThreadLocal));
thread2.start();
try {
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("再次获取在main线程中InheritableThreadLocal="+mainInheritableThreadLocal.get());
System.out.println("------InheritableThreadLocal end-------");
System.out.println("总结InheritableThreadLocal:主线程中设置的InheritableThreadLocal参数子线程可以获取;");
System.out.println(" 子线程中设置、修改的InheritableThreadLocal在主线程中也无法获得(针对值引用)");
}
/**
* 测试threadlocal
* @author wb-zhanghengyu
*
*/
class ChildThread implements Runnable{
ThreadLocal<String> childThreadLocal;
public ChildThread(ThreadLocal<String> childThreadLocal){
this.childThreadLocal=childThreadLocal;
}
@Override
public void run() {
System.out.println("在childThread中获取main线程中的threadlocal="+childThreadLocal.get());
System.out.println("在 child thread中调用threadlocal.set()。。。");
childThreadLocal.set("--child thread set string");
System.out.println("在childThread中获取child线程中修改的threadlocal="+childThreadLocal.get());
}
}
/**
* 测试inheritablethreadlocal
* @author wb-zhanghengyu
*
*/
class ChildThread2 implements Runnable{
InheritableThreadLocal<String> childInheritableThreadLocal;
public ChildThread2(InheritableThreadLocal<String> childInheritableThreadLocal){
this.childInheritableThreadLocal=childInheritableThreadLocal;
}
@Override
public void run() {
System.out.println("在childThread中获取main线程中的InheritableThreadLocal="+childInheritableThreadLocal.get());
System.out.println("在 child thread中调用InheritableThreadLocal.set()。。。");
childInheritableThreadLocal.set("--child thread set string");
System.out.println("在childThread中获取child线程中修改的InheritableThreadLocal="+childInheritableThreadLocal.get());
childInheritableThreadLocal.remove();
System.out.println("在childThread中获取child线程中remove后的InheritableThreadLocal="+childInheritableThreadLocal.get());
}
}
}
public class MyThreadLocal {
/**
* 用于验证threadlocal与inheritableThreadLocal的区别
* @param args
*/
public static void main(String[] args) {
ThreadLocal<String> mainThreadLocal=new ThreadLocal();
System.out.println("------ThreadLocal-------");
mainThreadLocal.set("--main thread set string");
System.out.println("在main线程中threadlocal="+mainThreadLocal.get());
Thread thread1=new Thread(new MyThreadLocal().new ChildThread(mainThreadLocal));
thread1.start();
try {
thread1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("再次获取在main线程中threadlocal="+mainThreadLocal.get());
System.out.println("------ThreadLocal end-------");
System.out.println("总结threadlocal:主线程中设置的threadlocal参数子线程无法获取;");
System.out.println(" 子线程中设置、修改的threadlocal在主线程中也无法获得(针对值引用)");
System.out.println("------InheritableThreadLocal-------");
InheritableThreadLocal<String> mainInheritableThreadLocal=new InheritableThreadLocal();
mainInheritableThreadLocal.set("--main thread set string");
System.out.println("在main线程中InheritableThreadLocal="+mainInheritableThreadLocal.get());
Thread thread2=new Thread(new MyThreadLocal().new ChildThread2(mainInheritableThreadLocal));
thread2.start();
try {
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("再次获取在main线程中InheritableThreadLocal="+mainInheritableThreadLocal.get());
System.out.println("------InheritableThreadLocal end-------");
System.out.println("总结InheritableThreadLocal:主线程中设置的InheritableThreadLocal参数子线程可以获取;");
System.out.println(" 子线程中设置、修改的InheritableThreadLocal在主线程中也无法获得(针对值引用)");
}
/**
* 测试threadlocal
* @author wb-zhanghengyu
*
*/
class ChildThread implements Runnable{
ThreadLocal<String> childThreadLocal;
public ChildThread(ThreadLocal<String> childThreadLocal){
this.childThreadLocal=childThreadLocal;
}
@Override
public void run() {
System.out.println("在childThread中获取main线程中的threadlocal="+childThreadLocal.get());
System.out.println("在 child thread中调用threadlocal.set()。。。");
childThreadLocal.set("--child thread set string");
System.out.println("在childThread中获取child线程中修改的threadlocal="+childThreadLocal.get());
}
}
/**
* 测试inheritablethreadlocal
* @author wb-zhanghengyu
*
*/
class ChildThread2 implements Runnable{
InheritableThreadLocal<String> childInheritableThreadLocal;
public ChildThread2(InheritableThreadLocal<String> childInheritableThreadLocal){
this.childInheritableThreadLocal=childInheritableThreadLocal;
}
@Override
public void run() {
System.out.println("在childThread中获取main线程中的InheritableThreadLocal="+childInheritableThreadLocal.get());
System.out.println("在 child thread中调用InheritableThreadLocal.set()。。。");
childInheritableThreadLocal.set("--child thread set string");
System.out.println("在childThread中获取child线程中修改的InheritableThreadLocal="+childInheritableThreadLocal.get());
childInheritableThreadLocal.remove();
System.out.println("在childThread中获取child线程中remove后的InheritableThreadLocal="+childInheritableThreadLocal.get());
}
}
}