Java 中的主线程

2024年9月10日 | 阅读 6 分钟

Java 中的主线程是任何 Java 程序的重要组成部分。当 Java 程序启动时,该线程会自动创建,并维护应用程序的 main() 方法。main() 方法作为程序的入口点,是程序启动时使用的初始方法。

主线程作为单个线程工作,这意味着每行代码都是按顺序执行的。该线程的其他名称是“主应用程序线程”和“主线程”。

程序可能需要的任何其他线程都必须由主线程创建和启动。它还负责组织这些线程的执行方式并确保它们有效地运行。

Java 主线程的属性

  • 入口点: 主线程充当程序的 main() 方法,这是程序的入口点。
  • 前台线程: 主线程是前台线程,这意味着程序将不会退出,直到主线程完成其执行。
  • 单线程处理: 主线程是单线程处理过程,这意味着它按顺序执行,一次一行。
  • 较高优先级: 主线程比程序创建的其他线程具有更高的优先级。这意味着它在 CPU 等系统资源上拥有优先权。
  • 系统定义: 当 Java 程序启动时,Java 虚拟机 (JVM) 会自动运行主线程。
  • 可以创建和启动其他线程: 主线程控制并启动程序可能需要的任何其他线程。它还负责组织这些行的执行方式。

如何控制主线程

在 Java 中,当 Java 程序启动时,Java 虚拟机 (JVM) 会自动创建主线程。但是,您可以使用 Java 语言提供的各种方法和技术来控制主线程的行为。以下是一些在 Java 中控制主线程的方法:

1) Sleep() 方法

可以使用 sleep() 函数将主线程的执行暂停设定的时间。这对于添加延迟或规划其他线程的运行时间很有用。

算法

步骤 1: 将变量“sleepTime”初始化为要暂停主线程执行的所需毫秒数。

步骤 2: 在主线程上调用 sleep() 方法,并将 sleepTime 值作为参数传递。

步骤 3: 主线程的执行将暂停 sleep() 方法设定的持续时间。

步骤 4: sleep 时间结束后,主线程将恢复执行,继续执行下一条语句。

实施

上述步骤的实现如下所示

文件名: MainThreadSleepExample.java

输出

Start of main thread
End of main thread

解释

在此示例中,主线程使用 sleep() 方法暂停了 5 秒钟。程序在主线程开始时打印一条消息,在主线程结束时打印另一条消息,中间有 5 秒延迟。

2) Join() 方法

可以使用 join() 方法来延迟主线程的执行,同时等待其他线程完成。这对于协调多个线程的执行很有用。

算法

步骤 1: 创建一个需要先完成才能让主线程继续执行的线程实例。

步骤 2: 现在使用 start() 方法启动线程。

步骤 3: 现在我们将调用线程对象上的 join() 方法。

步骤 4: join() 方法将挂起主线程的执行,直到线程对象完成处理。

步骤 5: 线程对象执行完成后,主线程将恢复执行,继续执行下一条语句。

实施

上述步骤的实现如下所示

文件名: MainThreadJoin.java

输出

Start of main thread
Start of other thread
End of other thread
End of main thread

解释

在此示例中,主线程创建了一个新线程,并使用 join() 方法等待其完成。新线程通过暂停 5 秒来模拟一些工作,然后完成。

3) Interrupt 方法

可以使用 interrupt() 技术来中断主线程或附加线程。这对于实现线程取消或终止很有用。

算法

步骤 1: 创建一个需要中断的线程实例。

步骤 2: 现在使用 start() 方法启动线程。

步骤 3: 调用线程对象上的 interrupt() 方法来中断其执行。

步骤 4: 当线程被中断时,标志将被设置为 true。

步骤 5: 要查看线程是否被中断,请使用 isInterrupted() 函数检查中断标志。

步骤 6: 适当地处理线程中断,例如通过优雅地停止线程或抛出异常。

实施

上述步骤的实现如下所示

文件名: MainThreadInterrupt.java

输出

Start of main thread
Start of other thread
Doing some work
Doing some work
End of main thread
Thread interrupted
End of other thread

解释

在此示例中,主线程创建了一个新线程,并在 2 秒后中断了它。新线程通过每秒打印一条消息来模拟工作,直到被中断。

4) 使用死锁场景

当两个或多个线程等待对方释放它们已经拥有的对象时,就会发生死锁。当两个或多个线程持有不同对象的锁并试图获取其他线程持有的对象的锁时。

算法

步骤 1: 启动程序。

步骤 2: 在 main 方法中,打印一条语句,指示您正在进入死锁。

步骤 3: 将当前线程加入自身。

步骤 4: 由于 join 方法将在其上调用的线程终止之前阻塞,因此这将导致死锁。

步骤 5: 程序将一直卡在死锁中,直到手动终止。

步骤 6: 如果抛出 InterruptedException,请打印异常的堆栈跟踪。

步骤 7: 结束程序。

实施

上述步骤的实现如下所示

文件名: DeadlockMain.java

输出

you are entering into the deadlock

解释

语句“Thread.currentThread().join()”指示主线程等待自身终止,从而导致死锁,主线程将无限期地等待自身完成。