Java多线程:start()与run()的差异及ThreadLocal解析
77 浏览量
更新于2024-08-28
收藏 86KB PDF 举报
"Java多线程总结,包括Thread.start()与Thread.run()的区别以及ThreadLocal类的简要介绍。"
在Java多线程编程中,理解如何启动和控制线程至关重要。这里主要讨论了`Thread.start()`和`Thread.run()`两个方法的不同作用。
一、`Thread.start()`与`Thread.run()`的区别
`Thread.start()`方法用于启动一个新的线程。当调用`start()`时,线程进入就绪状态,等待操作系统分配CPU时间片执行。一旦得到执行机会,它会调用该线程的`run()`方法。`run()`方法包含了线程的主要业务逻辑,即线程体。当`run()`方法执行完毕,该线程生命周期结束,CPU会转而执行其他线程。
相反,如果直接调用`Thread.run()`,那么不会创建新的线程,而是将`run()`方法作为普通方法在同一(通常是主线程)线程中执行,程序执行路径仍然是单一的,失去了多线程的意义。这一点可以通过测试代码清晰地看出。
例如,以下代码演示了两种情况的差异:
```java
public class MyThread implements Runnable {
public void run() {
System.err.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
MyThread thread = new MyThread();
Thread t1 = new Thread(thread, "Thread-1");
Thread t2 = new Thread(thread, "Thread-2");
// 直接调用run()方法
t1.run();
t2.run();
// 使用start()方法启动线程
t1.start();
t2.start();
}
}
```
直接调用`run()`会输出两次"主线程",而使用`start()`会看到两个不同的线程名,表明它们在各自的线程中独立执行。
二、`ThreadLocal`类详解
`ThreadLocal`是Java中一个非常有用的工具类,它为每个线程都提供了独立的变量副本,避免了线程间的数据冲突。`ThreadLocal`并不是一个本地线程,而是提供了一个线程局部变量的概念。每个线程都有自己的`ThreadLocal`变量副本,这些副本之间相互独立,互不影响。
`ThreadLocal`的主要操作方法有:
1. `set(T value)`:为当前线程设置`ThreadLocal`变量的值。
2. `get()`:获取当前线程的`ThreadLocal`变量的值。
3. `remove()`:移除当前线程的`ThreadLocal`变量。
使用`ThreadLocal`的一个常见场景是为每个线程提供一个独立的上下文对象,如HTTP请求处理中的用户会话信息或数据库连接。这样可以确保每个线程都有自己的独立数据,不会因并发访问导致数据混乱。
理解`Thread.start()`和`Thread.run()`的正确用法是实现多线程的关键,而`ThreadLocal`则提供了一种有效的线程安全数据管理方式。在Java多线程编程中,这两个概念都是不可忽视的重要知识点。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2013-03-06 上传
2019-04-06 上传
2021-09-30 上传
2013-05-08 上传
2012-07-23 上传
weixin_38715879
- 粉丝: 4
- 资源: 922