java多线程

一、线程简介

1、多任务

在这里插入图片描述

2、多线程

在这里插入图片描述
多线程:让几个方法同时执行

3、普通方法调用和多线程

在这里插入图片描述
多线程的效率更高

4、程序、进程、线程

在这里插入图片描述

5、process与thread

在这里插入图片描述
进程是系统资源分配的单位
线程是CPU调度和执行的单位

6、核心概念

在这里插入图片描述
main为主线程
main函数叫做用户线程,gc线程(JVM给的)叫做守护线程

多线程的目的:就是可以同时执行多个方法

二、线程实现(重点)

1、线程创建 (Thread、Runnable、Callable)

在这里插入图片描述
thread类实现了runnable接口

2、Thread

1)简介

在这里插入图片描述

2)部分文档

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3)demo

注意:调用run、start方法产生的结果是不同的。
在这里插入图片描述
线程不一定立即执行,CPU安排调度
在这里插入图片描述
在这里插入图片描述
注意:是调用start开启线程,而不是run方法

4)小例子:使用多线程下载图片

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述

在这里插入图片描述

3、实现runnable

1)简介

在这里插入图片描述

2)部分文档

在这里插入图片描述
在这里插入图片描述

3)demo

在这里插入图片描述
在这里插入图片描述

        //创建线程对象,通过线程对象来开启我们的线程,【代理】
//        Thread thread=new Thread(testThread3);
//        thread.start();

        //合并为下:
        new Thread(testThread3).start();

4)案例

在这里插入图片描述

4、小结

在这里插入图片描述
使用runnable接口的好处:

  • 避免单继承的局限性,方便同一个对象被多个线程使用

  • 一份资源,多个代理

5、并发问题demo

在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述

6、龟兔赛跑例子

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7、callable接口

1)简介

在这里插入图片描述

2)demo

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8、静态代理

1)简介

在这里插入图片描述

2)demo

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述

3)lambda表达式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
任何一个接口,如果只包含唯一一个抽象方法,那么他就是一个函数式接口,对于函数式接口,可以通过lambda表达式来创建该接口的对象。

1、一般实现

在这里插入图片描述

2、静态内部类的实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、局部内部类实现

在这里插入图片描述
在这里插入图片描述

4、匿名内部类实现

在这里插入图片描述
在这里插入图片描述

5、用lambda简化

在这里插入图片描述

6、另一个demo

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

多个参数的时候:
在这里插入图片描述
在这里插入图片描述
runnable是函数式接口,可以使用lambda表达式来进行简化

三、线程状态

1、五大状态

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、线程停止

1)简述

在这里插入图片描述
推荐线程自己停下来,
建议使用一个标志位让线程停下来

2)demo

在这里插入图片描述
在这里插入图片描述

运行结果:
在这里插入图片描述
注意:一定要让线程自己停下来

3、线程休眠-》sleep

1)简述

在这里插入图片描述
时间的单位是毫秒

sleep会有异常,需要抛出

每个对象都有一把锁,sleep不会释放锁

2)demo1:模拟网络延时

主要的作用:放大问题的发生性

在这里插入图片描述
在这里插入图片描述
会有-1

3)demo2:模拟倒计时

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、线程礼让-》yield

1)简述

在这里插入图片描述
让正在执行的程序暂停,但不阻塞,让线程从运行状态转化为就绪状态,让CPU在重新进行调度。

2)demo

在这里插入图片描述

礼让成功:
在这里插入图片描述
礼让不成功:
在这里插入图片描述

4、线程强制执行-》join

1)简述

在这里插入图片描述
可以想象成插队

2)demo

在这里插入图片描述
在这里插入图片描述

运行结果:
在这里插入图片描述
当main线程到200的时候,会让testJoin强制插队,对把testJoin执行完才会返回执行main线程
在这里插入图片描述

5、观测线程状态

1)简述

在这里插入图片描述
在这里插入图片描述

2)demo

线程一旦进入死亡状态,就不能再次启动了。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6、线程优先级

1)简述

在这里插入图片描述
在这里插入图片描述
性能倒置

2)demo

在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述

注意:先设置优先级,再启动

7、守护线程

1)简述

在这里插入图片描述
main -》用户线程
gc-》守护线程

2)demo

在这里插入图片描述
在这里插入图片描述

运行结果:
在这里插入图片描述

四、线程同步(重点)

1、线程同步机制

多个线程操作同一个资源

在这里插入图片描述
在这里插入图片描述
并发问题-》线程同步-》线程同步其实是一种等待机制

对象等待池
在这里插入图片描述

每个对象都有一把锁,sleep不会释放锁。

线程同步需要:队列+锁 -》安全

在这里插入图片描述

2、三大不安全案例

1)demo1

每个线程都在自己的工作内存交互,内存控制不当会造成数据不一致
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2)demo2

sleep可以放大问题的发生性
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3)demo3

在这里插入图片描述

3、同步方法及同步块

1)简述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
只有修改代码才需要锁
在这里插入图片描述

2)demo1

在这里插入图片描述
在这里插入图片描述

3)demo2

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4)demo3

在这里插入图片描述
synchronized块 锁住的对象是需要增删改的对象即可

5)copyonwriteArrayList

在这里插入图片描述

4、死锁

1)简述

在这里插入图片描述

2)demo

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

运行结果:
在这里插入图片描述
出现死锁

修改:

在这里插入图片描述

在这里插入图片描述
解决方法:就是不要让一个资源拿对方的锁就可以解决了。

3)死锁避免

在这里插入图片描述

5、Lock锁

1)简述

在这里插入图片描述
显式

2)reentrantLock 可重入锁

在这里插入图片描述
在这里插入图片描述

3)demo

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述

4)synchronized与lock的对比

在这里插入图片描述

五、线程通信问题

1、生产者和消费者问题

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、解决方法:管程法

利用缓冲区解决:管程法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述

注意:要使用while,而非if,不然会出现脏读

3、解决方法:信号灯法

信号灯法:标志位解决
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述

六、线程池

1、概念

在这里插入图片描述
在这里插入图片描述

2、demo

在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述

七、总结

1)回顾线程的创建

在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述

2)同步

synchronized、lock等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值