多线程
多线程
神奇海螺多线程
ThreadLocal 线程本地变量,同线程下共享
创建线程
第一种:
1.继承Thread类
2.重写run方法
3.创建对象,调用Thread.start方法开启线程(注意:start方法用于启动线程)
第二种:
1.实现Runnable接口
2.实现run方法
3.创建对象,调用Thread.start方法(需要构造Thread对象)开启线程(注意:start方法用于启动线程)
Thread.currentThread() 获取当前线程对象,(可以用于获取当前线程的各种信息)
sleep() 线程睡眠,单位毫秒
其他方法:
setPriority() 设置线程优先级
getPriority() 获取线程优先级
setDaemon(boolean on) 设置为守护线程,(当非守护线程执行结束,守护线程也随之结束)
static void yield() 让当前线程让出CPU使用权
join() 让当前线程插队执行
sleep(time) 让线程进入线程睡眠状态,不释放锁,超时后继续执行
stop() 终止线程(过时方法)
wait(time) 让线程进入线程等待状态,释放锁,超时后重新获取锁(有参的wait是计时等待)
线程安全:
1.同步代码块
synchronized(锁对象){} 拥有锁对象的线程才能执行,想要实现线程安全,必须使用同一个锁对象
2.同步方法
访问修饰符 synchronized 返回值 方法名字(参数列表){} 默认锁对象为this
3.同步静态方法
访问修饰符 static synchronized 返回值 方法名字(参数列表){} 默认锁对象为class
wait() 进入线程等待状态
notify() 随机唤醒一条等待线程
notifyAll() 唤醒所有等待线程
线程状态:
new 新建线程 线程被创建,但还没有启动
runnable 可运行 线程在jvm虚拟机中可运行的状态
blocked 阻塞 当需要锁却没有锁时处于阻塞状态
waiting 无限等待 一个线程正在等待另一个线程唤醒时,处于无限等待状态
timed waiting 计时等待 线程等待计时,处于计时等待状态
terminated 结束 线程运行结束时,处于线程结束状态
Lambda表达式
格式()->{}
() 参数列表
-> 对应的方法体
{} 方法体
Lambda表达式只能用在函数式接口上(只有一个抽象方法的接口,可以有其他方法,但抽象方法只能有一个)
@FunctionalInterface 检测是不是函数式接口
JDK提供的函数式接口
Supplier
Consumer
Function<T,R> 方法:R apply(T t) 根据T获取类型R
Predicate
Thread
创建线程方式1 继承Thread类
重写run方法实现内容
使用start启动线程
创建线程方式2 实现Runnable接口
通过实现run方法实现内容
创建Thread对象,用Thread对象启动线程
new Thread(),括号内放入实现Runnable接口的类的对象
Thread.currentThread() 返回当前线程对象
就绪状态
1.新建线程:调用start方法进入就绪
2.阻塞线程:阻塞解除,进入就绪
3.运行线程:调用yield方法,之后进入就绪
4.运行线程:jvm将CPU资源从本线程切换到其他线程
阻塞状态
1.执行sleep方法,,,使线程休眠,当指定时间到达,线程进入就绪状态
2.执行wait方法 ,使当前线程进入阻塞状态,使用nofity方法唤醒后,进入就绪状态
3.执行IO流的一些方法,当引起该操作的阻塞的原因消失后,进入就绪状态
4.join()线程联合:当某个线程等待另一个线程执行结束后,才可继续执行时,使用join方法
结束状态
1.完成run方法所有内容
2.被强制终止,执行stop()或destroy()方法终止线程,stop和destroy已被jvm废弃,不推荐使用
yield() 线程运行时调用yield方法会使当前线程进入就绪状态,但也有可能再次被执行。
x.join() 在其他线程中调用x.join方法,会使线程暂停,等待x线程执行完毕再执行。
定义线程名称
使用Thread的构造方法给定要修改名称,仅适用于继承Thread的线程
getName() 使用线程对象调用这个方法给定要修改的名称
isAlive() 判断线程是否存活,准备,运行,阻塞状态均属于存活状态。
int getpriority() 获取优先级
void setpriority(int newpriority) 设置优先级
setDaemon() 线程设置, false为用户线程,true为守护线程
线程同步 synchronized
1.synchronized块 synchronized(锁对象){需要同步的代码}
(1)用this作为锁对象,表示线程调用同一个对象会线程同步。 等于在非静态方法上添加synchronized
(2)x.class作为锁对象,表示线程调用x类的对象会线程同步。 等于在静态方法上添加synchronized
(3)用字符串作为锁对象,表示所有线程调用都会线程同步,因为所有的线程的锁对象都是这个字符串
2.synchronized方法 添加到范围操作符之后,返回类型声明之前,同一个对象下synchronized方法在多线程中执行,该方法是同步的
wait() 是Object下的方法 必须在synchronized块中执行,用途:让此线程处于阻塞状态,并释放对象锁
notify() 是Object下的方法 必须在synchronized块中执行,用途:唤醒一个被wait阻塞的线程。