多线程
进程和线程的区别
1.进程:电脑中的应用程序 有独立的系统资源和内存空间
2.线程:进程中每一个独立的任务 互相为竞争关系
多线程的好处
1,充分利用CPU资源
2,简化代码
3,提高用哪个户体验
创建线程的两种方式
1.继承java.lang.Thread类
2.实现java.lang.Runnable接口
多线程的创建步骤
1.定义线程(继承Thread类/实现Runnable接口)
实现Runnable接口:
继承Thread类:
2.创建线程的对象
继承Thread类:
实现Runnable接口:
3.启动线程
继承Thread类:
实现Runnable接口:
4.终止线程
线程执行完成自己的任务后会自己死亡,无需写代码。
注意:
调run和调start的区别:
- run:当前程序中只有main一条线程,所有事情需要main来完成
- start:开启一个全新的线程,主线程负责main方法中的代码,开启的线程负责run方法中的代码,各司其职在
Thread和Runnable两种方式的区别
- Thread:数据资源各论各的,单继承,创建线程很简单
- Runnable:数据资源共享,避免单继承的局限性
线程的五个状态
- 创建状态:ThreadA ta=new ThreadA();
- 就绪状态:线程启动以后,没有抢占到CPU资源
- 运行状态:线程抢到资源开始完成自己的任务
- 阻塞状态:程序员调用某个方法将线程转入休眠状态,冻结
不会和其他线程抢占资源 - 死亡状态:调用方法+自然死亡
线程优先级
含义:表示线程抢到CPU的概率 不绝对
取值范围:1-10 10最大(数值越大概率越大)
线程的相关方法
- currentThread:获取当前线程
- getName:获取线程的名字
- setName:修改线程的名字
- getPriority:获取线程优先级
- setPriority:修改线程优先级
- sleep:让线程休眠->阻塞状态
- join:强行插队
- yeild:线程l礼让
- interrupt:线程中断
- isAlive:判断线程是否处于活动状态(就绪/运行)
线程调度方法
- sleep:当前线程在指定 间内转入阻塞状态,时间没有结束前一直处于冻结,无法和其他线程抢占资源
- join:其他线程先把CPU资源让出来,让当前线程把自己的任务完成以 后,再把资源还给其他线程。适合处理紧急事件
- yeild:当前线程将资源吐出来,但是自己会立马转入就绪状态,继续和其他线程抢占资源。
线程同步
解决问题:多个线程抢占同一个资源出现冲突的问题
使用方法:使用synchronized修饰的方法控制对类成员变量的访问,synchronized就是为当前的线程声明一个锁
具体实现:
-
访问修饰符 synchronized 返回类型 方法名(参数列表){……}
或者
-
synchronized 访问修饰符 返回类型 方法名(参数列表){……}
-
使用synchronized关键字修饰的代码块
- 线程安全:实现线程同步则认为线程是安全的,但是效率比较低
常见的线程安全类:
a,安全:hashTable和StringBuffer
b,不安全:hashmap和Stringbuilder