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 条评论
登录 后参与评论

相关文章

来自专栏Android 研究

Android Handler机制12之Callable、Future和FutureTask

说到Callable就不能不说下java.lang.Runnable,它是一个接口,它只声明了一个run()方法,由于这个run()方法的返回值是void的,所...

732
来自专栏xingoo, 一个梦想做发明家的程序员

Java多线程之Runable与Thread

Java多线程是Java开发中的基础内容,但是涉及到高并发就有很深的研究可做了。 最近看了下《Java并发实战》,发先有些地方,虽然可以理解,但是自己在应用...

1919
来自专栏Python小屋

Python实现带有阻塞和超时放弃功能的队列结构

本文代码对Python列表进行封装并模拟了队列结构,入队时如果队列已满则阻塞当前线程,超时则放弃;出队时如果队列已空则阻塞当前线程,超时则放弃。 import ...

2924
来自专栏orientlu

FreeRTOS 信号量

FreeRTOS 信号量和互斥锁是基于队列实现的, 队列介绍见 << FreeRTOS 消息队列 >>。 使用信号量需要在源文件中包含头文件 semphr....

522
来自专栏土豆专栏

Java面试之栈和队列

队列:基于地址指针进行遍历,而且可以从头部或者尾部进行遍历,但是不能同时遍历,无需开辟空间,因为在遍历的过程中不影响数据结构,所以遍历速度快

972
来自专栏用户2442861的专栏

Java多线程学习(吐血超详细总结)

http://blog.csdn.net/evankaka/article/details/44153709

311
来自专栏芋道源码1024

数据结构 | Java 队列 —— Queue 详细分析

摘要: 原创出处 https://www.cnblogs.com/lemon-flm/p/7877898.html 「低调人生」欢迎转载,保留摘要,谢谢!

1250
来自专栏曾大稳的博客

生产者消费者模型

542
来自专栏架构之路

被废弃的 Thread.stop, Thread.suspend, Thread.resume 和Runtime.runFinalizersOnExit

最近学习多线程的知识,看到API里说这些方法被废弃了,就查了一下原因 Thread.stop 这个方法会解除被加锁的对象的锁,因而可能造成这些对象处于不一致的状...

3034
来自专栏我是攻城师

Java线程的基本知识总结

关于yield方法,是指当前线程可能运行不太重要的任务,可以通过这个方法暗示操作系统线程调度我可以晚点执行,先把CPU资源让给优先级给我一样或者大于我的任务,如...

644

扫描关注云+社区