多线程的基本概述
多线程的基本概念
基本概念:程序、进程、线程
- 程序
是为了完成特定任务,用某种语言编写的一组指定的集合。即一段静态的代码,静态对象。(算法+数据结构) - 进程是程序的一次执行过程,或是正在运行了一个程序。是一个动态的过程,有它自身的产生、存在和消亡的过程,—— 生命周期
- 程序是静态的,进程是动态的
- 进程作为资源分配的单位,系统在运行中会为每一个进程分配不同的内存区域。
线程进程可以进一步细化为线程,是程序内部的一条执行路径。
- 若一个程序同一时间并行执行多个线程,就是支持多线程的。
- 线程作为调度和执行的单位,每个线程都拥有独立的线程栈和程序计数器,线程切换的开销小。
- 一个进程中的多个线程共享同样的内存区域,它们从同一堆中分配对象,可以访问相同的变量和对象,这就使得线程之间的通信更简便、高效。但是多个线程操作共享的系统资源可能就会带来安全的隐患。
并行和并发
并行
多个CPU执行多个事情,比如:多个人做多个事情,并发
单个CPU执行多个事情,比如:多个人做一个事情使用多线程的优点
提升应用程序的响应速度,
- 提高计算机系统CPU的利用率
改善程序结构,将即长又复杂的进程分为多个线程,独立运行,利于理解和修改。
线程的创建和使用
java语言的JVM允许程序运行多个线程,通过java.lang.thread
Thread类的特性
- 每个线程都是通过某个特定的Thread对象的run()方法来完成操作的。经常把run方法的主体叫做线程体。
- 通过该Thread对象的start方法来启动这个线程,而不是直接调用run()
多线程的创建
方式一:继承Thread类
子类的实例重写run方法,实例调用start方法启动线程并执行run方法。- Thread常用方法
- start:启动当前线程,执行run
- run:重写此方法
- currentThread:静态方法,返回执行当前代码的线程
- getName()\setName:获取\设置当前线程的名字
- yield:释放当前cpu的执行权、静态方法
- join:调用另一个线程的join方法会使得当前线程进入阻塞状态等待另一个线程执行完成后再结束阻塞状态
- stop:强制结束当前线程(已过时)
- sleep(long): 静态方法,让当前线程睡眠指定的毫秒数。再指定的时间内,线程是阻塞状态
- isAlive:判断当前线程是否还存活
线程的调度
- 调度策略
- 时间片
- 抢占式:高优先级的线程抢占CPU
- 线程的优先级
- MAX_PRIORITY:10
- MIN_PRIORITY:1
- NORM_PRIORITY:5
- 涉及的方法
- getPriority():返回当前的优先级
- serPriority(int):设置当前的优先级
- 说明
- 线程创建的时候继承父类的优先级
- 低优先级的线程只是调度的概率低,并非一定是在高优先级的线程之后执行
- 线程的优先级
- Java的调度方法
- 同优先级线程
方式二:实现runnable接口
- 同优先级线程
- 调度策略
新建一个类实现runnable接口
- 重写run方法
- 将实现类的实例作为参数创建一个thread实例
启动thread实例的start方法,
方式一和方式二的选择
方式一有java单继承的限制
- 方式二单个实现类的实例可以开始多个线程,属性共享。
线程的声明周期
方式三:实现Callable接口
实现Callable接口
重写call方法
实例化实现类做为构造参数构造实例化一个FutureTask类
将FutureTest的做为构造参数实例化一个Thread类
调用Thread对象的start方法
可以调用Future的get()方法获取返回值
与Runnable的区别
- 相比run方法可以有返回值
- 方法可以抛出异常
- 支持泛型的返回值
- 需要借助FutureTask类,比如获取返回结果
方式四:线程池
好处
- 提高响应速度(减少了创建线程的时间)
- 降低资源消耗(重复利用,不需要每次都创建)
- 便于管理
- corePoolSize:核心池大小
- maximumPoolSize:最大线程数
- keepAliveTime:多久自行停止
- ExecutorService 和 Executors
- ExcutorService真正的线程池的接口,常见子类为:ThreadPoolExecutor
- Excutors工具类
ExecutorService service Executors.newFixedThreadPool(10);
//service.execute(实现runnable接口的实例);
//service.submit(实现Callable接口的实例);
service.shutdown();//关闭