多线程
程序 进程 线程
程序:一堆代码的封装,指的是我们保存在硬盘中的可执行文件。静态概念
进程:正在执行或等待执行的程序,在运行内存中处理。动态概念
线程:程序运行时,不同的执行分支。
Java来说,当我们的程序开始执行,也就是main方法开始执行,在栈内存中开辟以main方法为栈底元素的栈帧。此时,这个以main方法为栈底元素的链式栈帧调用就称为线程。
并发并行
并发:同时发生
并行:同时执行
单核CPU和多核CPU
1个CPU只能做一件事,所以没有办法并行执行,但是可以并发执行。
单核CPU是假的多线程,因为一个单位时间内,只能执行一个线程任务,多核CPU才能更好发挥多线程的效率
线程创建
创建线程有两种方式
1.继承Thread类,并覆写run方法
2.实现Runnable接口,并覆写run方法
Thread
使用方式
Runnable
优先级和常用方法
优先级
在Java中提供了1-10共10个优先级,在Thread中提供了三个常量,MIN_PRIORITY 代表1,NORM_PRIORITY 代表5,MAX_PRIORITY 代表10。子类 默认继承父类优先级,Thread默认是5
常用方法
setPriority 设置优先级
getPriority 获取优先级
getName 获取线程名称
setName 设置线程名字,如果不设置名字,默认为 Thread_0 开始,以此类推
static currentThread 获取当前线程对象
static sleep 让当前线程进入睡眠状态,参数为毫秒
使用方式
线程控制
线程停止
线程合并
Yield
Thread.yield 暂停当前正在执行的线程,并执行其他线程,并且只给同优先级让位。
线程同步
方法锁‘
Synchronized
访问一个加锁的成员方法/成员语句块时,该对象中所有加锁的成员方法/成员语句块都会被锁定。
访问一个加锁的静态方法/静态语句块时,该对象中所有加锁的静态方法/静态语句块都会被锁定。
synchronized(对象){} 对象语句块(成员语句块)
synchronized(类名。class){} 类语句块(静态语句块)
使用方式
方法锁
语句块锁
Lock
从JDK 5.0开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当.
java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的 工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象 加锁,线程开始访问共享资源之前应先获得Lock对象
ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和 内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可以 显式加锁、释放锁。
Lock是显式锁,需要手动开启手动关闭,并且JVM将花费较少的时间来完成线程调度.性能更好,并且还具备更好的扩展性.
使用方式
守护线程
守护线程:每一个main主程序的开启,都会同时开启一个守护线程来监听我们的正常程序执行。当没有线程执行的时候,守护线程也就终止了。
使用方式
定时器任务
定时器:计划任务,只要有一个计划任务,就会开启一个线程,进行计时监听
使用方式