上季内容回顾:
线程的一些其他操作方法:
· 线程的休眠:Thread.sleep() ;
本季主要知识点:
题目讲解、其他的操作方法、同步与死锁的操作
多线程习题:
image
分两种方式完成:
1、使用Thread类完成。
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第1张图片
看下效果:
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第2张图片
2、通过Runnable接口实现
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第3张图片
效果如下:
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第4张图片
中断线程的运行
image
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第5张图片
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第6张图片
看下效果:
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第7张图片
程序执行太快了,我们再修改下程序
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第8张图片
看下效果:程序休眠8秒后中断
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第9张图片
最好可以让代码返回到被调用处
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第10张图片
现在E --> run方法执行完毕就没有输出
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第11张图片
现在我们互换下程序休眠的时间看看效果
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第12张图片
OK,看下效果,此时程序休眠没被中断哈~!
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第13张图片
查看线程的中断状态
image
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第14张图片
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第15张图片
看一下这个程序的线程名字: main
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第16张图片
下面我们测试中断状态
image
看下效果:显示线程没有中断
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第17张图片
下面我们加入一个线程中断
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第18张图片
这时看下程序效果:显示线程中断了
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第19张图片
接着看下线程能否进入休眠状态
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第20张图片
发现线程不能被休眠
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第21张图片
查看下现在中断状态又是什么呢?
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第22张图片
发现没有被中断哈~
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第23张图片
多线程问题--资源协调(重点)
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第24张图片
北京的一列火车,会有多个订票点卖票,证明,所有的订票点每一个都是一个线程,所有的线程共同卖一套票。
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第25张图片
验证下效果:
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第26张图片
此处是没有任何延迟的情况下,暂时出现了正确的结果,下面我们来模拟下网络的延迟情况下程序的执行效果(比如延迟0.1秒)
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第27张图片
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第28张图片
解决这个问题我们需要使用到数据同步
同步代码块
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第29张图片
Java程序中分为四种代码块:
· 普通代码块
· 构造块
· static静态块
· 同步代码块

使用关键字: synchronized
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第30张图片
哈~~~程序执行没有负数出现,但是好像票都被Thread-0卖光了哈~~~
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第31张图片
同步代码块加错位置,应加在程序判断位置
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第32张图片
看下效果,没有问题了:
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第33张图片
同步方法:
使用 synchronized声明的方法就叫同步方法
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第34张图片
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第35张图片
此代码中卖票将判断与ticket--放在一起操作,我们判断下效果:效果一样哈~
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第36张图片
多个线程共享同一个资源,肯定是需要同步的,以保证数据的正确性,但是同步是需要牺牲性能的。
同步会有新的问题:
张三 --> 李四 |
张三的哥哥 --> 王五
李四 --> 拿出500W救出你弟弟
王五 --> 把弟弟放了,我给你500W
因为同步造成了两个人的状态停滞 --> 死锁
模拟一个死锁的情况来看:
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第37张图片
我们发现程序不向下执行了,死锁了哈~~~
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第38张图片
如果假设其中一个松口了,会怎么样?
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第39张图片
看下效果:交易成交哈~~~
[零基础学JAVA]Java SE应用部分-25.多线程(03)_第40张图片
总结
目的:阐述概念:
多个线程共享同一个资源的时候,必须进行同步,但是过多的同步会造成系统的死锁
同步的关键字: synchronized
同步代码块中必须有一个需要同步的对象,一般都为当前对象 —— this
#######################################################