这门课只讲 Java 多线程里最基础、也最容易卡住初学者的一环:线程的创建、状态切换、停止和等待。它不涉及并发容器、锁、线程池这些进阶内容,更像是把「线程是什么、怎么让它跑起来、怎么让它停下来」这一整条主线讲透。

它解决什么问题

很多人在写 Java 时,第一次接触多线程是背了 Thread 和 Runnable 的写法,但不知道为什么有两种创建方式,也不知道线程到底处于什么状态。等真正去处理一个耗时任务,想把一段逻辑放到后台执行时,才发现自己写出来的线程要么停不下来,要么主线程和子线程的执行顺序完全对不上。

这门课就针对这几个具体场景:怎么让一个任务在独立线程里跑、怎么理解程序/进程/线程三者的区别、线程从创建到结束到底经过哪些状态、如何用 return/break 或 interrupt 来停止一个线程、以及如何用 join 让一个线程等待另一个线程完成。它把这些问题拆成一段段短视频,每一段只讲一个点,适合用来补概念、理逻辑。

适合什么基础

你不需要提前学过并发编程,但至少得会写简单的 Java 类和方法,知道什么是类、对象、循环、条件判断。如果刚学完 Java 基础,对多线程只有模糊印象,那这门课正好帮你把「线程」这一章从零搭起来。如果你已经会用 ExecutorService 或 ThreadPoolExecutor,那这门课对你来说可能偏基础,但用来回顾线程状态和中断机制也有价值。

建议先看前几块:从「线程有什么用」「程序、进程和线程的区别」开始,再跟到「线程技术基础」和两种创建子线程方法的对比。这几部分加起来不到一小时,能让你先搞清楚为什么要用多线程、两种写法到底差在哪里。之后再顺着看线程的状态,最后再进入停止和 join 的部分。

学完能独立做什么

学完这套内容,你能够独立完成这些事:写一个类继承 Thread,或者实现 Runnable 接口,把任务放到子线程里跑;在读别人的代码时,能判断出当前线程处于什么状态(新建、就绪、运行、阻塞、终止);能根据业务需要,用 interrupt 或标志位来安全地停止一个线程,而不是用已经废弃的 stop();还能用 join 协调两个线程的执行顺序,比如让主线程等待子线程完成后再继续。

这些能力在写简单的后台任务、定时任务、或者处理大文件时都能直接用上。虽然还不足以应对高并发场景,但已经为后续学锁、线程池、并发集合打下了扎实的底子。

资料怎么配合练习:不要只把视频一遍遍看过去,每看完一个小节,就打开 IDE 照着例子敲一遍,然后改参数、改逻辑,观察结果。比如看完线程状态,就写一个循环里 sleep 的程序,用 getState() 打印状态变化;看完 interrupt,就写一个线程在 sleep 时被中断的案例,看看异常是怎么抛出来的。把视频里演示的代码变成自己的,比多看十遍有用。最后再试着把几段知识点串起来:启动一个线程,让它计算某个结果,主线程用 join 等它完成,再打印结果。这样你才算真正掌握了。

课程目录

课程目录43 集
  • 1 线程有什么用 (05:54).mp4
  • 2 程序,进程和线程的区别 (15:54).mp4
  • 3 线程技术基础 (07:59).mp4
  • 4 java创建子线程为什么要有两种方法2 (03:10).mp4
  • 5 java创建子线程为什么要有两种方法 (13:58).mp4
  • 6 java创建子线程为什么要有两种方法3 (04:55).mp4
  • 7 java创建子线程为什么要有两种方法4 (07:35).mp4
  • 8 下面介绍第二种方法创建子线程 (05:36).mp4
  • 9 java线程的状态1 (04:13).mp4
  • 10 java线程的状态2 (05:17).mp4
  • 11 java线程的状态3 (14:06).mp4
  • 12 java线程的状态4 (03:08).mp4
  • 13 java线程的状态5 (03:21).mp4
  • 14 停止(stop)一个线程(靠着return,break)1 (11:49).mp4
  • 15 停止(stop)一个线程(靠着return, break)2 (41).mp4
  • 16 停止(stop)一个线程(靠着return, break)3 (01:19).mp4
  • 17 停止(stop)一个线程(靠着return, break)4 (02:50).mp4
  • 18 停止(stop)一个线程(靠着return, break)5 (03:46).mp4
  • 19 停止(stop)一个线程(靠interrupt手段)1 (04:20).mp4
  • 20 停止(stop)一个线程(靠interrupt手段)2 (05:46).mp4
  • 21 停止(stop)一个线程(靠interrupt手段)3 (04:48).mp4
  • 22 停止(stop)一个线程(靠interrupt手段)4 (08:21).mp4
  • 23 一个线程join另一个线程(包括和interrupt互动)2 (08:03).mp4
  • 24 一个线程join另一个线程(包括和interrupt互动)1 (07:14).mp4
  • 25 一个线程join另一个线程(包括和interrupt互动)3 (10:07).mp4
  • 26 一个线程捕获另外一个线程的异常1 (06:49).mp4
  • 27 一个线程捕获另外一个线程的异常2 (13:18).mp4
  • 28 主线程如何捕获子线程的异常 (07:49).mp4
  • 29 精灵线程(Daemon)或守护线程 (07:21).mp4
  • 30 线程安全1 (12:19).mp4
  • 31 下面我们再给出一个线程不安全的例子1 (04:26).mp4
  • 32 下面我们再给出一个线程不安全的例子2 (09:19).mp4
  • 33 线程同步(synchronized)1 (07:35).mp4
  • 34 线程同步(synchronized)2 (11:53).mp4
  • 35 线程同步Synchronized监视器monitor和锁 1 (08:45).mp4
  • 36 线程同步Synchronized监视器monitor和锁 2 (09:01).mp4
  • 37 线程同步Synchronized监视器monitor和锁 3 (09:19).mp4
  • 38 Synchronized引起的并发线程的无限等待的解决方法 (19:18).mp4
  • 39 死锁1 (14:36).mp4
  • 40 死锁2 (04:16).mp4
  • 41 wait()、notify()和notifyAll()方法1 (07:06).mp4
  • 42 wait()、notify()和notifyAll()方法2 (12:42).mp4
  • 43 一个高层线程工具类(Timer) (13:45).mp4