返回

让主线程不会阻塞!Thread源码阅读

后端

开启新线程后,主线程还会阻塞吗?

了解线程阻塞的真相

在多线程编程中,一个常见的问题是:当我们开启一个新线程时,主线程是否会阻塞?为了解答这个问题,让我们深入探讨 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 时间。

常见问题解答

  1. 什么是线程阻塞?

线程阻塞是指一个线程由于某种原因而无法继续执行的情况,例如等待其他线程或资源。

  1. 抢占式调度算法是如何工作的?

抢占式调度算法允许 JVM 随时中断正在执行的线程,并切换到另一个就绪的线程。

  1. 为什么开启新线程不会阻塞主线程?

因为 Java 使用抢占式调度算法,确保了每个线程都能公平地获得 CPU 时间。

  1. 默认情况下,Java 中的主线程会阻塞吗?

不会,默认情况下,主线程不会阻塞。

  1. 在哪些情况下主线程可能会阻塞?

主线程可能会在使用 join() 方法等待其他线程终止时阻塞。