线程
引言
什么是线程?
线程是操作系统调度的最小执行单位,它代表了一个独立的执行流。在Java中,线程是由java.lang.Thread
类表示的。每个Java程序都至少有一个主线程,主线程由JVM自动创建和启动。
为什么需要使用线程?
使用线程可以实现多任务并发执行,提高程序的响应能力和效率。在单线程环境下,当一个任务阻塞时,整个程序都会被阻塞,无法进行其他任务。而使用多线程可以在一个线程阻塞时,让其他线程继续执行,从而提高程序的并发性和吞吐量。
线程基础
线程的状态和生命周期
线程有以下几种状态:
- New:线程刚创建,还没有开始执行。
- Runnable:线程从就绪状态转换为运行状态,此时线程开始执行。
- Blocked:线程进入阻塞状态,等待获取锁。
- Terminated:线程执行完毕。
- Waiting:线程进入等待状态,等待其他线程通知。
- Timed_Waiting:线程进入等待状态,等待其他线程通知,等待的时间为指定的时间。
线程的生命周期包括线程的创建、就绪、运行、阻塞和终止等阶段。
线程的创建和启动
创建线程的两种常见方式是继承Thread
类和实现Runnable
接口。通过重写run()
方法定义线程的执行逻辑,然后调用start()
方法启动线程。
线程的命名和优先级
可以为线程指定一个名称,方便识别和调试。
每个线程都有一个优先级,用于指示线程在竞争CPU时间时的相对重要,但不保证绝对的执行顺序。线程优先级用整数表示,范围从1(最低优先级)到10(最高优先级),默认为5。可以使用setPriority()
方法设置线程的优先级。
Thread中的构造器及常用方法
-
构造器:Thread类提供了多个构造器,可以指定线程的名称:
-
Thread()
:创建一个默认名称的线程。 -
Thread(Runnable r)
:创建一个线程,线程的代码从Runnable接口的实现类中来。 -
Thread(Runnable r, String name)
:创建一个线程,线程的代码从Runnable接口的实现类中来,线程的名称为name。 -
Thread(String name)
:创建一个线程,线程的名称为name。
-
-
run()
:线程执行的代码从run()方法开始,当线程执行完毕后,run()方法结束。 -
start()
:调用start()方法,线程就会开始执行。 -
sleep()
:调用sleep()方法,线程就会进入休眠状态,直到休眠时间结束,线程进入就绪状态。 -
yield()
:调用yield()方法,线程就会释放CPU资源,让出执行权给其他线程,但是不释放线程的资源,线程进入就绪状态。 -
stop()
:调用stop()方法,线程就会停止执行。 -
setName()
:调用setName()方法,设置线程的名称。 -
getName()
:调用getName()方法,获取线程的名称。 -
setPriority()
:调用setPriority()方法,设置线程的优先级。 -
getPriority()
:调用getPriority()方法,获取线程的优先级。 -
setDaemon()
:调用setDaemon()方法,设置线程为守护线程。 -
isDaemon()
:调用isDaemon()方法,判断线程是否为守护线程。 -
setContextClassLoader()
:调用setContextClassLoader()方法,设置线程的上下文类加载器。 -
getContextClassLoader()
:调用getContextClassLoader()方法,获取线程的上下文类加载器。 -
setUncaughtExceptionHandler()
:调用setUncaughtExceptionHandler()方法,设置线程的未捕获异常处理器。 -
getUncaughtExceptionHandler()
:调用getUncaughtExceptionHandler()方法,获取线程的未捕获异常处理器。 -
setDefaultUncaughtExceptionHandler()
:调用setDefaultUncaughtExceptionHandler()方法,设置默认的未捕获异常处理器。 -
getDefaultUncaughtExceptionHandler()
:调用getDefaultUncaughtExceptionHandler()方法,获取默认的未捕获异常处理器。 -
setStackTrace()
:调用setStackTrace(),设置线程的栈跟踪。 -
getStackTrace()
:调用getStackTrace(),获取线程的栈跟踪。 -
interrupt()
:将线程的中断状态设置为true。
线程通信
等待/通知机制
等待/通知机制是线程间进行协调和通信的重要机制之一。它基于对象的监视器(锁)实现,通过wait()
、notify()
和notifyAll()
方法实现线程的等待和唤醒。
wait()、notify()和notifyAll()方法
wait()
方法使当前线程进入等待状态,释放锁并等待被其他线程唤醒;`继续上述内容:
notify()
方法用于唤醒一个正在等待的线程,而notifyAll()
方法则唤醒所有正在等待的线程。