返回
让主线程不会阻塞!Thread源码阅读
后端
2023-12-24 02:45:31
开启新线程后,主线程还会阻塞吗?
了解线程阻塞的真相
在多线程编程中,一个常见的问题是:当我们开启一个新线程时,主线程是否会阻塞?为了解答这个问题,让我们深入探讨 Java 中线程的机制,并通过一个实验来验证。
实验:主线程和新线程的并行执行
我们编写了一个 Java 程序,在一个新线程中执行一个无限循环,同时主线程也执行另一个无限循环。
public class Main {
public static void main(String[] args) {
// 开启一个新线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("子线程正在运行...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.start();
// 主线程代码
while (true) {
System.out.println("主线程正在运行...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
运行此程序,你会发现主线程和新线程同时运行,没有发生阻塞。这表明在 Java 中,开启一个新线程并不会阻塞主线程。
为什么主线程不会阻塞?
要理解为什么主线程不会阻塞,我们需要了解 Java 虚拟机 (JVM) 的线程调度机制。
JVM 使用抢占式调度算法,这意味着它可以随时中断正在执行的线程,并切换到另一个就绪的线程。这种调度算法确保了每个线程都能公平地获得 CPU 时间,从而避免了某个线程独占 CPU 的情况。
当我们开启一个新线程时,JVM 将它添加到就绪队列。一旦 CPU 有空闲,JVM 就会选择一个就绪的线程(包括新线程)并将其调度到 CPU 上。因此,主线程和新线程可以并行执行,而不会相互阻塞。
默认情况下,主线程会阻塞吗?
默认情况下,Java 中的主线程(也称为主线程)不会阻塞。这是因为 JVM 采用了抢占式调度算法,确保了每个线程都能获得 CPU 时间。
常见问题解答
- 什么是线程阻塞?
线程阻塞是指一个线程由于某种原因而无法继续执行的情况,例如等待其他线程或资源。
- 抢占式调度算法是如何工作的?
抢占式调度算法允许 JVM 随时中断正在执行的线程,并切换到另一个就绪的线程。
- 为什么开启新线程不会阻塞主线程?
因为 Java 使用抢占式调度算法,确保了每个线程都能公平地获得 CPU 时间。
- 默认情况下,Java 中的主线程会阻塞吗?
不会,默认情况下,主线程不会阻塞。
- 在哪些情况下主线程可能会阻塞?
主线程可能会在使用 join()
方法等待其他线程终止时阻塞。