七、多线程
线程
-
线程是操作系统能够运行调度的最小单位
-
被包含在进程之中,是进程的实际运行单位
-
应用软件中相互独立,可以同时运行的功能
-
每一个线程都有自己的栈
并发和并行
-
并发:在同一时刻,有多个指令在单个CPU上交替执行
-
并行:在同一时刻,有多个指令在多个CPU上同时执行
多线程的实现方式
继承Thread类
-
定义一个类继承Thread
-
重写run方法
-
创建类的对象,调用start()方法开启线程
实现Runnable接口
-
定义一个类实现Runnable接口
-
重写run方法
-
创建类的对象
-
创建一个Thread类的对象(形参是自己创建类的对象),开启线程
-
run方法里面可以获取当前线程的对象
-
Thread t = Thread.currentThread();
利用Callable接口和Future接口
-
实现接口时的泛型代表运行结果的类型
成员方法
-
线程的默认名字 Thread-X(X序号,从0开始)
-
抢占式调度(随机)多个线程抢占CPU的执行权和时间
-
优先级 1~10 默认5
-
不是立马结束,陆续结束
线程的生命周期
同步代码块
-
锁对象是唯一的
-
-
static Object obj = new Object();
-
用当前类的字节码文件对象 MyThread.class
-
同步方法
Lock锁
死锁
-
是一个错误,线程A和线程B分别用两把锁,程序卡死
-
互相都等另一个线程的锁释放
等待唤醒机制
-
生产者和消费者
-
轮流执行
阻塞队列
-
在main方法中创建实现类
-
在对应的线程类中需要在成员变量写对应的 ArrayBlockingQueue<String> queue;
-
并在构造方法中也实现
-
queue对应的方法有
-
put
-
take
线程的状态
-
没有运行状态
线程池
自定义线程池
最大并行数
-
4核8线程
-
8就是最大并行数
CPU密集型运算
-
计算比较多
-
线程池数量=最大并行数+1
-
I/O密集型运算
-
读取本地文件和数据库
-
thread dump工具可以计算时间