多线程
2021-02-09 23:02:08 14 举报
AI智能生成
麻烦顺手点个赞,这样作者可以绘制更多脑图哈
作者其他创作
大纲/内容
线程与进程
进程:运行的程序
线程:程序内的一条执行路径
进程可以进一步细化为线程,如果一个进程并发执行多个线程,就是多线程
并行与并发
并行:多个CPU同时执行多个进程
并发:一个CPU同时执行多个进程
应用场景
程序需要同时执行多个任务
需要一些后台运行的程序
调度策略
时间片
抢占式
高优先级只是概率大,不代表必然优先
线程安全
同步代码块
操作共享数据的代码即为需要被同步的代码
共享数据:多个线程共同操作的变量
锁:多个线程必须使用同一把锁(任何对象都可以作为锁)
缺点:同步代码块内部相当于单线程,效率不高
同步方法
同步方法仍然涉及锁,只是不需要显示申明
非静态代码块使用this
静态代码块使用当前类本身
Lock锁
手动启动同步和释放锁
死锁问题
不同的线程分别占用对方的同步资源不放弃,导致阻塞
解决方法:1、专门的算法、原则 2、尽量少的定义同步资源 3、尽量避免嵌套同步
JVM
子主题
单核与多核
单核:同一时间只能执行一个线程,CPU因为切换速度快,看上去像是同时执行很多进程
多核:可以更好的发挥多线程的效率
优点:1、提高应用程序响应,提升用户体验 2、提高CPU利用率 3、改善程序结构,将复杂程序分成多个线程模块,解耦合
创建
方式一:继承Thread类
1、创建一个Thread的子类
2、重写run方法
3、实例化Thread的子类对象
4、调用该对象的start方法
简化:
//创建Thread类的匿名子类的方式
new MyThread(){
@Override
public void run() {
for (int i=0;i<20;i++) {
System.out.println(Thread.currentThread().getName()+"我的匿名线程");
}
}
}.start();
new MyThread(){
@Override
public void run() {
for (int i=0;i<20;i++) {
System.out.println(Thread.currentThread().getName()+"我的匿名线程");
}
}
}.start();
多个子线程就各自继承Thread类,重写各自的run方法
方式二:实现Runnable接口
1、创建一个类实现Runnable接口
2、实现接口的run方法
3、实例化类为对象
4、创建Thread对象,将该对象作为Thread构造器的参数
5、Thread调用start方法
一和二区别:
1、由于Java只支持单继承,所以实现Runnable接口更实用
2、Runnable更有利于保存共享数据,因为数据放在构造器参数里面
一和二相同点
都重写run方法,把子线程逻辑写在run方法里面
方式三:实现Callable接口
方式四:线程池
好处
1、提高响应效率
2、提高资源利用率
3、方便线程管理
核心池的大小
最大线程数
线程没有任务时保持多久终止
生命周期
创建
就绪
运行
堵塞
死亡
wait():执行此方法会阻塞并且释放锁
notify():唤醒被wait的线程
麻烦顺手点个赞,这样作者可以绘制更多脑图哈
0 条评论
下一页