java多线程-ThreadLocal
ThreadLocal:每个线程自身的存储本地、局部区域,类似于容器,每个线程都会在其中有一定存储空间
常用的方法get/set/initialValue
官方建议为private static
每个线程存储自己的数据,更改不会影响其他线程
ThreadLocal 子类InheritableThreadLocal:
继承上下文环境的数据
成都创新互联成立以来不断整合自身及行业资源、不断突破观念以使企业策略得到完善和成熟,建立了一套“以技术为基点,以客户需求中心、市场为导向”的快速反应体系。对公司的主营项目,如中高端企业网站企划 / 设计、行业 / 企业门户设计推广、行业门户平台运营、手机APP定制开发、手机网站开发、微信网站制作、软件开发、资阳托管服务器等实行标准化操作,让客户可以直观的预知到从成都创新互联可以获得的服务效果。
public class my {
//Integer 初始值为null
//private static ThreadLocal threadlocal=new ThreadLocal<>();
//更改初始值需要创建ThreadLocal的子类重写initialValue或者使用lambda(jdk8)
private static ThreadLocal threadlocal=new ThreadLocal ()
{//父类匿名内部类重写方法
protected Integer initialValue()
{
return 200;
}
};
//private static ThreadLocal threadlocal=new ThreadLocal.withInitial(()->200);
public static void main(String[]args) throws InterruptedException
{
//获取值
System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get());
//设置值
threadlocal.set(99);
System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get());
new Thread(new test()).start();
new Thread(new test()).start();
}
public static class test implements Runnable
{
public void run()
{
threadlocal.set((int)(Math.random()*100));
System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get());
}
}
}
每个线程自身的数据更改不会影响其他线程
public class my {
private static ThreadLocal threadlocal=new ThreadLocal ()
{//父类匿名内部类重写方法
protected Integer initialValue()
{
return 1;
}
};
public static void main(String[]args) throws InterruptedException
{
for(int i=0;i<5;i++)
{
new Thread(new test()).start();
}
}
public static class test implements Runnable
{
public void run()
{
//修改不会影响其他线程
Integer left=threadlocal.get();
System.out.println(Thread.currentThread().getName()+"-->"+left);
threadlocal.set(left-1);
System.out.println(Thread.currentThread().getName()+"还剩下"+threadlocal.get());
}
}
}
分析ThreadLocal运行环境:
public class my {
private static ThreadLocal threadlocal=new ThreadLocal ()
{//父类匿名内部类重写方法
protected Integer initialValue()
{
return 1;
}
};
public static void main(String[]args) throws InterruptedException
{
new Thread(new test()).start();//两个打印的内容在不同的线程里
//当start()之后,线程才从main转换到其他线程,所以构造器里的是main线程的
}
public static class test implements Runnable
{
public test()
{
threadlocal.set(100); //属于main线程,修改不会影响start内的线程
System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get());
}
public void run()
{
System.out.println(Thread.currentThread().getName()+"还剩下"+threadlocal.get());
}
}
}
子类InheritableThreadLocal:
public class my {
private static ThreadLocal threadlocal=new InheritableThreadLocal<>();
public static void main(String[]args) throws InterruptedException
{
System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get());
threadlocal.set(2);
//此线程由main线程开辟,拷贝一份main线程的数据给此线程
//即将main线程里的2给此线程
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get());
threadlocal.set(200);
System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get());
}).start();
}
}
网站栏目:java多线程-ThreadLocal
文章地址:http://cdiso.cn/article/pccdjd.html