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.ThreadLocal
,ThreadLocal
为解决多线程程序的并发问题提供了一种新的思路,并在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
类用来提供线程内部的局部变量,这种变量在多线程环境下访问(通过get
或set
方法访问)时能保证各个线程里的变量相对独立于其他线程内的变量。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
类图
好了,本次文章到此结束,如果你有更好的理解,欢迎留言!
- 通过java来格式化sql语句(r4笔记第61天)
- Servlet第四篇【request对象常用方法、应用】
- Servlet第五篇【介绍会话技术、Cookie的API、详解、应用】
- Java类加载器(用户自定义类加载器实现)
- Servlet第六篇【Session介绍、API、生命周期、应用、与Cookie区别】
- 一个oracle蠕虫病毒 (r4笔记第60天)
- 提高效率,eclipse上你可能不知道的技巧
- AJAX入门这一篇就够了
- 014 Java的反射机制
- XML+JSON面试题都在这里
- 客户关系管理系统
- 016 Java中的动态代理
- JSON就是这么简单
- 017 Java中的静态代理、JDK动态代理、cglib动态代理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法