(1)定义:
1-多线程:一个应用程序有多条[执行路径]
2-单线程:一个应用程序只有一条执行路径
3-线程:是进程的[执行单元,执行路径],是程序使用CPU的最基本单位
是进程中的单个顺序控制流,是一条执行路径
4-进程:[正在执行的应用程序],是系统进行资源分配和调用的独立单位
每一个进程都有它自己的内存空间和系统资源
(2)多线程的实现方案
1-继承Thread类
步骤:
1-自定义类继承Thread类
2-自定义类重写run()方法
3-创建自定义类对象
4-启动线程
--直接调用run()方法,就相当于普通的方法调用
2-实现Runnable接口
步骤:
1-自定义类实现Runnable接口
2-自定义类重写public void run()方法
3-创建自定义类对象
4-创建Thread类的对象,并把3步骤的对象做构造参数传递
--同一个对象调用多次start(),会产生非法的线程状态异常,多线程--多个对象
3-多线程实现的第三种方案:前提是有线程池和实现Callable接口
(3)线程的调度和优先级问题
1-线程的调度
1.分时调度:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片
2.抢占式调度 (Java采用的是该调度方式):优先让优先级高的线程使用CPU,
如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的CPU时间片相对多一些
2-获取和设置线程优先级
public final int getPriority()--返回线程对象的优先级
public final void setPriority(int newPriority)--更改线程对象的优先级
--非法参数异常:
1.默认是5
2.范围是1-10
线程优先级高仅仅表示线程获取的CPU时间片的几率高,但因为随机性,要多次运行才能看到效果
(4)线程的控制(常见方法)
1-休眠线程--public static void sleep(long millis)-毫秒
2-加入线程--public static void join()-等待该线程终止
3-礼让线程--public static void yield()-暂停当前正在执行的线程对象,并执行其他线程
让多个线程的执行更和谐,但不能靠它保证一人一次
4-后台线程--public static void setDaemon(boolean on)-将此线程标记为守护程序线程或用户线程。
当运行的唯一线程都是守护程序线程时,Java虚拟机将退出
必须在启动(start)线程之前调用此方法。
5-终止线程(掌握)--public static void stop()-让线程停止,已过时
--public void interrupt()-中断线程,把线程状态停止,抛出一个异常
(5)线程的生命周期
1-新建--创建new Thread线程对象
2-就绪--调用了start()方法之后,该线程处于就绪状态
3-运行--执行run方法的线程代码块,则该线程处于运行状态
4-阻塞--调用sleep()或线程在等待wait()某个通知(notify)。
5-死亡--run()方法执行完成,线程正常结束。
线程抛出一个未捕获的Exception或Error
(6)多线程安全问题
1)原因:
1-是否有多线程环境
2-是否有共享数据
3-是否有多条语句操作共享数据
2)同步解决线程安全问题
1-同步代码块:被synchronized关键字修饰的语句块,内置锁:同一个数据。
synchronized(同一数据) {
需要被同步的代码;
}
注意:同步可以解决安全问题的根本原因就在那个同一数据上
2-同步方法:在方法定义上使用Synchronized关键字修饰,锁对象默认用this或前类class对象
public Synchronized 数据返回类型 方法名(){}
多线程基础整理2