多线程
线程的定义
- 线程 Thread
- 进程内部的一个执行单元,它是程序中一个单一的顺序控制流程。
- 线程又被称为轻量级进程(lightweight process)
- 如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为多线程
线程的特点
- 轻量级进程
- 独立调度的基本单位
- 可并发执行
- 共享进程资源
多线程的优缺点:
优点:有良好的资源使用率;程序设计在某些情况更简单;程序相应速度更快
缺点:设计更复杂上下文切换存在开销 ,消耗资源
线程与进程的区别:
线程的两种创建方法:
类:Extends Thread
public class 类名 Extends Thread{
//重写run方法
@Overrdie
public void run(){
//方法体
}
public static void main (String[]args){{
类名 对象名=new 类名();
Thread 对象名1=new Thread(对象名);
对象名1.start( );
}
}
接口:impleements Runnable
public class 类名 impleements Runnable{
//重写run方法
@Overrdie
public void run(){
//方法体
}
public static void main (String[]args){{
类名 对象名=new 类名();
Thread 对象名1=new Thread(对象名);
对象名1.start( );
}
}
两种线程创建方式的比较:
• 继承Thread类方式的多线程
• 优势:编写简单
• 劣势:无法继承其它父类
• 实现Runnable接口方式的多线程
• 优势:可以继承其它类,多线程可共享同一个Runnable对象
• 劣势:编程方式稍微复杂,如果需要访问当前线程,需要调用Thread.currentThread()方法
• 实现Runnable接口方式要通用一些。
线程的生命周期:
-
新建状态:NEW
- 用new关键字建立一个线程对象后,该线程对象就处于新生状态。
- 处于新生状态的线程有自己的内存空间,通过调用start进入就绪状态
-
就绪状态:RUNNABLE
- 处于就绪状态线程具备了运行条件,但还没分配到CPU,处于线程就绪队列,等待系统为其分配CPU
- 当系统选定一个等待执行的线程后,它就会从就绪状态进入执行状态,该动作称之为“cpu调度”。
-
运行状态:RUNNABLE
- 如果就绪状态的线程获取 CPU 资源,就可以执行run(),此时线程便处于运行状态
-
阻塞状态:BLOCKED
- 被阻塞等待监视器锁定的线程处于此状态。
- 等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。
- 同步阻塞:线程在获取 synchronized同步锁失败(因为同步锁被其他线程占用)。
- 其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。
三种方法可以进入阻塞状态:sleep方法使进程进入睡眠(抱资源睡眠)yield方法让当前正在运 行的线程回到可运行状态,以允许具有相同优先级的其他线程获得运行的机会。 (礼让)join方法插队
- 死亡状态:TERMINATED
- 死亡状态是线程生命周期中的最后一个阶段。线程死亡的原因有三个。一个是正常运行的线程完成了它的全部工作;另一个是线程被强制性地终止,如通过执行stop方法来终止一个线程[不推荐使用】,三是线程抛出未捕获的异常。
线程的基本功能
线程优先级:
线程优先级从小到大为:1-10
系统默认优先级为5级
线程调度器按照优先级来决定调度哪个线程先来执行