【Java】多线程-thread类的常用方法和生命周期【主线学习笔记】
文章目录
- 前言
- 线程的常用结构
- 线程中的构造器
- 线程中的常用方法
- 线程的优先级
- 线程的生命周期
- 线程状态转换图
前言
Java是一门功能强大且广泛应用的编程语言,具有跨平台性和高效的执行速度,广受开发者喜爱。在接下来的学习过程中,我将记录学习过程中的基础语法、框架和实践技巧等,分享学习心得,对自己学习过程进行整理和总结,也希望能为其他学习Java的朋友提供一些帮助和参考。
线程的常用结构
在 Java 中,线程是多线程编程的基本单位,它可以通过两种方式来创建:继承 Thread
类或实现 Runnable
接口。下面我们根据框架详细介绍线程的各个方面。
线程中的构造器
Thread
类提供了多种构造器来创建线程,最常用的有以下几种:
-
Thread()
:创建一个没有指定目标的线程。线程创建后,必须重写run()
方法,或者通过start()
调用继承Thread
的子类的run()
方法。Thread thread = new Thread();
-
Thread(Runnable target)
:接受一个实现了Runnable
接口的对象,调用该对象的run()
方法来执行线程任务。Runnable task = new MyRunnable(); Thread thread = new Thread(task);
-
Thread(String name)
:指定线程名称。Thread thread = new Thread("MyThread");
-
Thread(Runnable target, String name)
:既指定了线程任务(Runnable
对象),又指定了线程名称。Runnable task = new MyRunnable(); Thread thread = new Thread(task, "MyThread");
线程中的常用方法
Thread
类提供了许多控制线程的方法,以下是一些常用的线程操作方法:
-
start()
:启动线程。调用该方法后,run()
方法会在线程中执行。thread.start();
-
run()
:线程的执行体,必须重写run()
方法以定义线程的任务。当线程启动后,run()
方法会自动被调用。 -
current Thread()
:获取当前执行代码对应的线程。 -
setName(String name)
:为线程设置一个名称。thread.current Thread().setName("NewThreadName");
-
getName(String name)
:获取线程名称。 -
sleep()
:让当前线程进入休眠状态指定的时间(以毫秒为单位)。sleep() 是静态方法,用于暂停线程的执行。try { Thread.sleep(1000); // 休眠1秒 } catch (InterruptedException e) { e.printStackTrace(); }
-
yield()
:静态方法,让当前执行的线程让出CPU资源,使其他同等优先级的线程可以执行。但这并不意味着当前线程会立刻停止。Thread.yield();
-
join()
:等待其他线程完成执行。主线程可以调用某个子线程的join()
方法,意味着主线程进入阻塞状态,主线程会等待该子线程执行完毕后才继续运行。 -
interrupt()
:中断线程。如果线程处于等待或休眠状态,会抛出InterruptedException
异常。该方法不会直接终止线程,只是通知线程要中断。 -
isAlive()
:检查线程是否处于活动状态(已启动但尚未终止)。
boolean isActive = thread.isAlive();
setDaemon(boolean on)
:设置守护线程。守护线程在所有非守护线程结束后自动结束。通常用作后台服务线程。
thread.setDaemon(true); // 设置为守护线程
-
getId()
:获取线程的唯一ID。 -
getState()
:获取线程的当前状态(如 NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED)。
Thread.State state = thread.getState();
线程的优先级
线程的优先级决定了线程获取 CPU 时间片的可能性,优先级高的线程更有可能先执行,但不能保证绝对顺序。线程优先级是一个整数,范围从 1到10。
-
默认优先级:线程默认的优先级是
5
。可以通过setPriority()
方法来设置优先级,使用getPriority()
获取优先级。thread.setPriority(Thread.MAX_PRIORITY); // 设置最高优先级 10
-
优先级范围:
Thread.MIN_PRIORITY = 1
(最低优先级)Thread.NORM_PRIORITY = 5
(默认优先级)Thread.MAX_PRIORITY = 10
(最高优先级)
-
优先级的影响:
虽然高优先级的线程有更大的机会获得 CPU 时间片,但这取决于操作系统的线程调度机制,不能完全依赖优先级来控制执行顺序。
线程的生命周期
Java 中线程的生命周期可以分为以下几个状态:
-
NEW(新建):
- 当线程对象被创建后但还没有调用
start()
方法时,线程处于新建状态。 - 此时线程还没有运行,也没有分配任何系统资源。
Thread thread = new Thread(new MyRunnable());
- 当线程对象被创建后但还没有调用
-
RUNNABLE(可运行):
- 线程已经调用
start()
方法,进入了就绪状态,等待 CPU 调度。 - 线程进入就绪队列,一旦获得 CPU 时间片后就会进入运行状态。
thread.start(); // 线程进入RUNNABLE状态
- 线程已经调用
-
BLOCKED(阻塞):
- 当线程等待进入同步区域(如等待锁定某个对象时),它会进入阻塞状态。
- 一旦获取到资源,线程会重新进入 RUNNABLE 状态。
-
WAITING(等待):
- 线程等待其他线程的通知或特定的事件(如调用
Object.wait()
、Thread.join()
等方法)时,进入等待状态。 - 该状态下,线程不会消耗 CPU 资源,直到其他线程通过
notify()
或notifyAll()
解除等待。
- 线程等待其他线程的通知或特定的事件(如调用
-
TIMED_WAITING(计时等待):
- 线程进入一种有时间限制的等待状态,比如调用
Thread.sleep()
或带超时时间的Object.wait(long timeout)
。 - 到期后线程会自动从这个状态回到 RUNNABLE。
- 线程进入一种有时间限制的等待状态,比如调用
-
TERMINATED(终止):
- 线程执行完成或由于异常退出后,会进入终止状态。
- 线程在此状态下无法再次启动。
thread.join(); // 线程终止,进入TERMINATED状态