Java 线程池源码解读与实践
肖文英
Java 资深研发工程师
27 人已学习
立即订阅
课程目录
已更新 28 讲/共 32 讲
并发编程基础知识 (8讲)
时长 09:08
时长 40:33
时长 21:26
时长 44:37
时长 09:11
线程池基础知识 (6讲)
时长 12:38
时长 09:28
时长 30:59
时长 44:51
时长 45:02
时长 15:15
线程池实现详解 (8讲)
时长 14:10
时长 23:21
时长 25:00
时长 13:57
时长 36:02
时长 17:28
时长 42:08
常见开源线程池 (3讲)
时长 22:14
时长 27:06
时长 25:32
Java 线程池源码解读与实践
15
15
1.0x
00:00/00:00
登录|注册

线程

1 什么是线程

在计算机科学领域,线程是指在一个进程内部执行的独立单元。一个进程可以包含多个线程,每个线程都有自己的执行路径,可以独立运行。线程是操作系统进行任务调度单位,它允许我们实现并发执行,使得程序能够更高效地利用计算机资源。
Java 是一门强大的编程语言,其中最引人注目的特性之一是多线程支持。多线程允许我们在同一程序中同时执行多个任务,这大大提高了应用程序的性能和响应能力。本文将深入介绍 Java 线程的基础知识,无论您是初学者还是有一定经验的开发人员,都将从中获益。

2 创建与启动线程

2.1 两种常见方式

在 Java 中,有两种常见的方式来创建和启动线程:
继承 Thread 类: 您可以创建一个继承自 Thread 类的子类,并重写 run() 方法来定义线程的执行逻辑,然后创建线程对象并调用 start() 方法来启动线程。
实现 Runnable 接口: 您可以创建一个实现 Runnable 接口的类,并重写 run() 方法来定义线程的执行逻辑,然后创建线程对象,并将 Runnable 对象传递给线程的构造函数,并调用 start() 方法来启动线程。
需要注意的是我们在构造 Thread 对象后不需要调用 run 方法,Thread 对象在获取 CPU 时间片后会自动运行 run 方法。
下面是两种方式的示例代码:
// 继承Thread类创建线程
public class MyThread extends Thread {
public void run() {
// 线程的执行逻辑
for (int i = 0; i < 10; i++) {
System.out.println("Thread: " + i);
}
}
}
// 实现Runnable接口创建线程
public class MyRunnable implements Runnable {
public void run() {
// 线程的执行逻辑
for (int i = 0; i < 10; i++) {
System.out.println("Runnable: " + i);
}
}
}
public class Main {
public static void main(String[] args) {
// 创建并启动继承Thread类的线程
MyThread myThread = new MyThread();
myThread.start();
// 创建并启动实现Runnable接口的线程
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
}
}

2.2 Future 方式

除了上述两种方式,还可以使用 Future 来创建线程,这是一种更高级的方法,允许线程执行完毕后获取结果。
public class MyCallable implements Callable<Integer> {
public Integer call() {
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i;
}
return sum;
}
}
public class Main {
public static void main(String[] args) throws Exception {
MyCallable myCallable = new MyCallable();
FutureTask<Integer> futureTask = new FutureTask<>(myCallable);
Thread thread = new Thread(futureTask);
thread.start();
int result = futureTask.get();
System.out.println("线程执行结果:" + result);
}
}

3 线程的生命周期

3.1 Java 线程的生命周期

了解线程的生命周期对于编写多线程程序非常重要,因为我们需要根据线程的状态来进行合适的操作和控制。
一个 Java 线程可以处于以下几种状态:
新建状态(New): 当线程对象被创建但尚未启动时线程处于此状态。
可运行状态(Runnable): 在 Java 虚拟机中执行的线程处于此状态。
阻塞状态(Blocked):  等待监视器锁的线程处于此状态。
等待状态(Waiting): 无限期等待另一个线程执行特定动作的线程处于此状态。
定时等待状态(Timed Waiting): 等待另一个线程执行动作,最多等待指定时间的线程处于此状态。
终止状态(Terminated): 已退出的线程处于此状态。

3.2 线程的状态转换

一个线程在其生命周期内会经历不同的状态,这些状态之间可以相互转换。以下是线程的状态转换图:
理解这些状态的转换非常重要,因为我们需要根据线程的当前状态来决定如何操作线程,以实现我们想要的并发行为。

3.3 和操作系统线程状态对应关系

可运行状态(Runnable):处于此状态下的线程正在 Java 虚拟机中执行,但它可能正在等待来自于操作系统的其它资源没有运行,比如处理器或 IO,也可能获取了 CPU 时间片处于运行中。
阻塞状态(Blocked):一个处于 blocked 状态的线程正在等待一个监视器锁 (注和 Lock 接口锁不一样) 以进入一个同步块或方法。
注意我们重点介绍另一种情况,InputStream 的 read 调用,该操作是不可中断的,如果流中没有数据,read 方法会阻塞 (但线程状态依然是 JVM 的 RUNNABLE 状态),且不响应 interrupt(),与 synchronized 类似,调用 interrupt() 只会设置线程的中断标志,而不会真正"中断"它。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 线程池源码解读与实践》
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
大纲
固定大纲
1 什么是线程
2 创建与启动线程
2.1 两种常见方式
2.2 Future 方式
3 线程的生命周期
3.1 Java 线程的生命周期
3.2 线程的状态转换
3.3 和操作系统线程状态对应关系
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部