Thread ThreadLocal,傻傻分不清

Thread相信大家都不陌生,作为一个多线程的使用存在,不管是在Java处理并发数据还是Android中处理异步数据或是更新UI操作等,几乎随处可见它的身影。

ThreadLocal,咋一看,咦,和Thread长得好像呀,难道不是两兄弟吗?

事实告诉我们,NO,他们不是亲兄弟。

概念

首先我们来看官方是如何解释的:

Thread源码描述:

public class Thread extends Object implements Runnable A thread is a thread of execution in a program. The Java Virtual Machine allows an application to have multiple threads of execution running concurrently.

早在JDK1.2的版本中就提供java.lang.ThreadLocalThreadLocal为解决多线程程序的并发问题提供了一种新的思路,并在JDK1.5开始支持泛型。这个工具类可以很简洁地编写出优美的多线程程序。

当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立的改变自己的副本,而不会影响其他线程所对应的副本。从线程的角度来看,目标变量就像是本地变量,这也是类名中"Local"所要表达的意思。所以,在Java中编写线程局部变量的代码相对来说要"笨拙"一些,因此造成了线程局部变量没有在Java开发者得到很好的普及。

ThreadLocal源码描述:

This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable. ThreadLocal instances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID).

大体意思是:

ThreadLocal类用来提供线程内部的局部变量,这种变量在多线程环境下访问(通过getset方法访问)时能保证各个线程里的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static 类型,用于关联线程。

通过源码的描述我们大体能知道,Thread包含ThreadLocal

常用方法

Thread

定义一个线程有两种方法:

1、继承java.lang.Thread类,重写run方法

public class ThreadTest extends Thread {     
   //重写(Override) 自动调用run()方法
    @Override    
    public void run() {       
      System.out.println("I'm running!");   
    }    
  // 重载(Overload)run()方法 
  //和普通的方法一样,并不会在该线程的start()方法被调用后被JVM自动运行      
   @Overload
    public void run(int times) {
        System.out.println("I'm running!(Overload)");     
   }
 }

2、实现java.lang.Runnable接口

/**  * 通过实现Runnable接口创建一个线程  *  */
public class ThreadTest implements Runnable {    
  public void run() {           
    System.out.println("I'm running!");    
  } 
}

启动方式:

1)如果线程是继承Thread类,则创建方式如下:

ThreadTest1 tt = new ThreadTest1(); 
tt.start();

2)如果是实现Runnable接口,则创建方式如下:

ThreadTest2 tt = new ThreadTest2(); 
Thread t = new Thread(tt);
 t.start();

ThreadLocal

1、set()方法

设置当前线程的线程局部变量的值

2、get()方法

该方法返回当前线程所对应的线程局部变量

3、remove()方法

直接将当前线程局部变量的值删除

最后,来一张ThreadLocal类图

好了,本次文章到此结束,如果你有更好的理解,欢迎留言!

原文发布于微信公众号 - 猿份到(sparkcliff)

原文发表时间:2017-10-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小灰灰

Java并发之 volatile & synchronized & ThreadLocal 讲解

Java 之 volatile & synchronized & ThreadLocal 讲解 在并发编程中,基本上离不开这三个东西,如何实现多线程之间的数据...

2216
来自专栏IMWeb前端团队

递归函数的优化

本文作者:IMWeb 寒纱阁主 原文出处:IMWeb社区 未经同意,禁止转载 递归函数是一个函数自我调用而构成的,如下是一个典型的递归阶乘函数: fu...

18910
来自专栏java一日一条

50个常见的 Java 错误及避免方法(第二部分)

System.out.println("Whatdo you want to do?");

1093
来自专栏小狼的世界

Linux下不同文件编码的转换

字符编码(Character Encoding)可以说就是让某一字符序列匹配一个指定集合中的某一东西,常见的例子包括长短电键组合起来表示的摩斯电码(Morse ...

782
来自专栏散尽浮华

Python介绍

Python概述 Python创始人是吉多.范罗苏姆。在1989年万圣节期间为打发时间而开发的。 目前Python在TIOBE排行榜第五位置 ? Python可...

28910
来自专栏西枫里博客

PHP7新特性之两个小小语法糖。

想起写下这篇原本是因为群里龙大佬说PHP7下count有问题,顺道就讽了他一句。其实我自己也没有详细了解下PHP7到底在哪些方面做了修改。所以空了就翻了翻手册,...

1011
来自专栏C语言及其他语言

C语言自定义函数如何返回数组(下)?

通过上一篇的讲解,相信大家已经明白直接的return数组的问题以及原因了,今天我们将详细为大家讲解在函数中返回数组的常见办法。 此类问题,应用场景往往为了解决函...

3395
来自专栏大内老A

关于CLR内存管理一些深层次的讨论[上篇]

半年之前,PM让我在部门内部进行一次关于“内存泄露”的专题分享,我为此准备了一份PPT。今天无意中将其翻出来,觉得里面提到的关于CLR下关于内存管理部分的内存还...

1828
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-23(01)总结多线程,线程实现Runnable接口,线程名字获取和设置,线程控制,线程安全,同步线程

1:多线程(理解) (1)多线程:一个应用程序有多条执行路径 进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行...

4544
来自专栏javathings

Java 内存模型简述

Java 内存在逻辑功能上分成 5 个区。方法区,堆区,JVM 栈,方法栈,程序计数器(PC 寄存器)。

1082

扫码关注云+社区