1.多线程指的是在单个程序中可以同时运行多个同的线程执行不同的任务。线程是程序内的顺序控制流,只能使用分配给序的资源和环境。
线程是轻量级子进程,是最小的处理单元。这是一条单独的执行路径。
线程是独立的。如果一个线程中发生异常,则不会影响其他线程。它使用共享存储区。
- 线程不会阻塞用户,因为线程是独立的,您可以同时执行多个操作。
- 线程可以使您一起执行许多操作,因此可以节省时间。
- 线程是独立的,因此,如果单个线程中发生异常,则不会影响其他线程。
通过两种方式实现多任务处理:
- 基于进程的多任务处理(多进程)
- 基于线程的多任务处理(多线程)
3.1 基于进行的多任务处理(多进程)
- 每个进程在内存中都有一个地址。换句话说,每个进程分配一个单独的存储区。
- 进程之间的通信成本很高。
- 从一个进程切换到另一个进程需要一些时间来保存和加载寄存器,内存映射,更新列表等。
3.2 基于线程的多任务处理(多线程)
- 线程共享相同的地址空间。
- 线程是轻量级的。
- 线程之间的通信成本很低。
注意:每个线程至少需要一个进程。
Java提供Thread类来实现多线程编程。Thread类提供了构造方法和普通方法来创建线程和执行线程。Thread类继承了Object类并实现了Runnable接口。
| 修饰符 | 方法 | 描述 |
| void | start() | 用于启动线程的执行。 |
| void | run() | 用于对线程执行操作。 |
| static void | sleep() | 使线程休眠指定的时间。 |
| static Thread | currentThread() | 返回对当前正在执行的线程对象的引用。 |
| void | join() | 等待线程死亡。 |
| int | getPriority() | 返回线程的优先级。 |
| void | setPriority() | 更改线程的优先级。 |
| String | getName() | 返回线程的名称。 |
| void | setName() | 更改线程的名称。 |
| long | getId() | 返回线程的ID。 |
| boolean | isAlive() | 判断线程是否还活着。 |
| static void | yield() | 使当前正在执行的线程对象暂停,并允许其他线程临时执行。 |
| void | suspend() | 用于挂起线程。 |
| void | resume() | 用于恢复挂起的线程。 |
| void | stop() | 用于停止线程。 |
| void | destroy() | 用于销毁线程组及其所有子组。 |
| boolean | isDaemon() | 判断线程是否是守护线程。 |
| void | setDaemon() | 将线程标记为守护程序或用户线程。 |
| void | interrupt() | 中断线程。 |
| boolean | isinterrupted() | 判断线程是否已被中断。 |
| static boolean | interrupted() | 判断当前线程是否已被中断。 |
| static int | activeCount() | 返回当前线程的线程组中活动线程的数量。 |
| void | checkAccess() | 确定当前正在运行的线程是否有权修改该线程。 |
| static boolean | holdLock() | 当且仅当当前线程在指定对象上持有监视器锁时,它才返回true。 |
| static void | dumpStack() | 用于将当前线程的堆栈跟踪信息打印到标准错误流。 |
| StackTraceElement[] | getStackTrace() | 返回一个表示线程堆栈转储的堆栈跟踪元素数组。 |
| static int | enumerate() | 用于将每个活动线程的线程组及其子组复制到指定的数组中。 |
| Thread.State | getState() | 用于返回线程的状态。 |
| ThreadGroup | getThreadGroup() | 用于返回该线程所属的线程组。 |
| String | toString() | 用于返回此线程的字符串表示形式,包括线程的名称,优先级和线程组。 |
| void | notify() | 仅用于通知正在等待特定对象的一个线程。 |
| void | notifyAll() | 用于向特定对象的所有等待线程发出通知。 |
| void | setContextClassLoader() | 为线程设置上下文ClassLoader。 |
| ClassLoader | getContextClassLoader() | 返回线程的上下文ClassLoader。 |
| static Thread.UncaughtExceptionHandler | getDefaultUncaughtExceptionHandler() | 返回由于未捕获的异常导致线程突然终止时调用的默认处理程序。 |
| static void | setDefaultUncaughtExceptionHandler() | 设置当线程由于未捕获的异常突然终止时调用的默认处理程序。 |
2.线程生命周期
1)新建如果创建Thread类的实例,但在调用start() 方法之前,则该线程处于新建状态。
2)就绪调用start() 方法后,线程处于就绪状态,但是线程调度程序未将其选择为正在运行的线程。
3)运行如果线程调度程序选择了该线程,则该线程处于运行状态。
4)阻塞这是线程仍处于活动状态但当前不符合运行条件的状态。
5)死亡当线程的run() 方法退出时,该线程处于终止状态或死亡状态。
3.线程创建方式
有两种创建线程的方法:
- 通过继承Thread类
- 通过实现Runnable接口。
Thread类的start() 方法用于启动新创建的线程。start方法的内部执行以下任务:
- 一个新的线程开始(带有新的调用栈)。
- 线程从“新建”状态转到“就绪”状态。
- 当线程有机会执行时,run() 方法将被运行。
继承Thread类方式创建线程 class Demo extends Thread{ public void run(){ System.out.println("thread is running..."); } public static void main(String args[]){ Demo t1=new Demo(); t1.start(); } }
实现Runnable接口方式创建线程 class Demo implements Runnable{ public void run(){ System.out.println("thread is running..."); } public static void main(String args[]){ Demo m1=new Demo(); Thread t1 =new Thread(m1); t1.start(); } }
4.Java线程调度程序主要使用抢占式或时间片调度来调度线程。
5.Java 线程休眠
Thread类的sleep()方法 用于使线程休眠指定的时间。
一次只执行一个线程。如果在指定的时间内休眠一个线程,那么线程调度程序(sheduler)将获取另一个线程,依此类推。
6.Java join()方法
Java join() 方法表示等待线程死亡。换句话说,它导致当前正在运行的线程停止执行,直到与之连接的线程完成其任务为止。
7.Java 线程的命名
- public String getName():用于返回线程的名称。
- public void setName(String name):用于更改线程的名称。
8.Java currentThread() 方法返回当前正在执行的线程的引用。
9.Java 线程优先级
每个线程都有一个优先级。优先级由1到10之间的数字表示。在大多数情况下,线程计划会根据线程的优先级来调度线程(称为抢先式调度)。但是不能保证一定被调用,因为是 否被调用取决于JVM选择谁来调度。
- public static int MIN_PRIORITY
- public static int NORM_PRIORITY
- public static int MAX_PRIORITY
10.Java 守护线程
Java中的守护程序线程是一个服务提供者线程,向用户线程提供服务。它的寿命受到用户线程的控制,即当所有用户线程死亡时,JVM会自动终止该线程。
11.Java线程池 表示一组正在等待作业并多次重复使用的工作线程。
12.Java提供了一种将多个线程组合到单个对象中的便捷方法。这样,我们可以通过单个方法调用来挂起,恢复或中断线程组。
13.Java垃圾回收
垃圾回收是自动回收运行时未使用的内存的过程。换句话说,这是销毁未使用对象的一种方法。
- 它使Java内存更加高效,因为垃圾回收器从堆内存中删除了未引用的对象。
- 它由垃圾收集器(JVM的一部分)自动完成,因此我们无需付出额外的工作。
14.Java Runtime
Java Runtime类用于与Java运行时环境进行交互。Java Runtime类提供了用于执行进程,调用GC,获取总内存和可用内存等的方法。
| 方法 | 描述 |
| public static Runtime getRuntime() | 返回Runtime类的实例。 |
| public void exit(int status) | 终止当前虚拟机。 |
| public void addShutdownHook(Thread hook) | 注册新的关闭钩子线程。 |
| public Process exec(String command)throws IOException | 在一个单独的过程中执行给定的命令。 |
| public int availableProcessors() | 返回是否可用的进程。 |
| public long freeMemory() | 返回JVM中的可用内存量。 |
| public long totalMemory() | 返回JVM中的总内存量。 |
15.Java 线程同步
Java中的同步是控制多个线程对任何共享资源的访问的能力。
- 为了防止线程干扰。
- 保证数据一致性。
如果将任何方法声明为synchronized方法,则称为同步方法。
同步方法用于锁定任何共享资源的对象。
当线程调用同步方法时,它将自动获取该对象的锁,并在线程完成其任务时释放该锁。
16.同步代码块可用于对方法的任何特定资源执行同步。
假设您的方法中有50行代码,但是您只想同步5行,则可以使用synchronized代码块。
如果将方法的所有代码放在同步代码块中,它的效果与同步方法相同。
17.Java线程死锁
由于两个线程都在互相等待释放锁,因此这种情况称为死锁。
18.Java线程通信
线程间通信是一种机制,其中一个线程在其关键部分中暂停运行,并允许另一个线程进入(或锁定)在同一关键部分中执行,这是通过以下Object类的方法实现的:
- wait()
- notify()
- notifyAll()
19.Java终止线程
Thread类提供的3种终止线程的方法:
- public void interrupt()
- public static boolean interrupted()
- public boolean isInterrupted()



