上季内容回顾:
线程的一些其他操作方法:
· 线程的休眠:Thread.sleep() ;
本季主要知识点:
题目讲解、其他的操作方法、同步与死锁的操作
多线程习题:
[零基础学JAVA]Java SE应用部分-25.多线程(03)_JAVA
分两种方式完成:
1、使用Thread类完成。
[零基础学JAVA]Java SE应用部分-25.多线程(03)_零基础学JAVA_02
看下效果:
[零基础学JAVA]Java SE应用部分-25.多线程(03)_同步_03
2、通过Runnable接口实现
[零基础学JAVA]Java SE应用部分-25.多线程(03)_多线程_04
效果如下:
[零基础学JAVA]Java SE应用部分-25.多线程(03)_JAVA_05
中断线程的运行
[零基础学JAVA]Java SE应用部分-25.多线程(03)_零基础学JAVA_06
[零基础学JAVA]Java SE应用部分-25.多线程(03)_同步_07
[零基础学JAVA]Java SE应用部分-25.多线程(03)_零基础学JAVA_08
看下效果:
[零基础学JAVA]Java SE应用部分-25.多线程(03)_JAVA_09
程序执行太快了,我们再修改下程序
[零基础学JAVA]Java SE应用部分-25.多线程(03)_零基础学JAVA_10
看下效果:程序休眠8秒后中断
[零基础学JAVA]Java SE应用部分-25.多线程(03)_零基础学JAVA_11
最好可以让代码返回到被调用处
[零基础学JAVA]Java SE应用部分-25.多线程(03)_零基础学JAVA_12
现在E --> run方法执行完毕就没有输出
[零基础学JAVA]Java SE应用部分-25.多线程(03)_同步_13
现在我们互换下程序休眠的时间看看效果
[零基础学JAVA]Java SE应用部分-25.多线程(03)_JAVA_14
OK,看下效果,此时程序休眠没被中断哈~!
[零基础学JAVA]Java SE应用部分-25.多线程(03)_零基础学JAVA_15
查看线程的中断状态
[零基础学JAVA]Java SE应用部分-25.多线程(03)_synchronized_16
[零基础学JAVA]Java SE应用部分-25.多线程(03)_多线程_17
[零基础学JAVA]Java SE应用部分-25.多线程(03)_synchronized_18
看一下这个程序的线程名字:main
[零基础学JAVA]Java SE应用部分-25.多线程(03)_零基础学JAVA_19
下面我们测试中断状态
[零基础学JAVA]Java SE应用部分-25.多线程(03)_synchronized_20
看下效果:显示线程没有中断
[零基础学JAVA]Java SE应用部分-25.多线程(03)_零基础学JAVA_21
下面我们加入一个线程中断
[零基础学JAVA]Java SE应用部分-25.多线程(03)_多线程_22
这时看下程序效果:显示线程中断了
[零基础学JAVA]Java SE应用部分-25.多线程(03)_同步_23
接着看下线程能否进入休眠状态
[零基础学JAVA]Java SE应用部分-25.多线程(03)_零基础学JAVA_24
发现线程不能被休眠
[零基础学JAVA]Java SE应用部分-25.多线程(03)_JAVA_25
查看下现在中断状态又是什么呢?
[零基础学JAVA]Java SE应用部分-25.多线程(03)_多线程_26
发现没有被中断哈~
[零基础学JAVA]Java SE应用部分-25.多线程(03)_同步_27
多线程问题--资源协调(重点)
[零基础学JAVA]Java SE应用部分-25.多线程(03)_零基础学JAVA_28
北京的一列火车,会有多个订票点卖票,证明,所有的订票点每一个都是一个线程,所有的线程共同卖一套票。
[零基础学JAVA]Java SE应用部分-25.多线程(03)_多线程_29
验证下效果:
[零基础学JAVA]Java SE应用部分-25.多线程(03)_零基础学JAVA_30
此处是没有任何延迟的情况下,暂时出现了正确的结果,下面我们来模拟下网络的延迟情况下程序的执行效果(比如延迟0.1秒)
[零基础学JAVA]Java SE应用部分-25.多线程(03)_JAVA_31
[零基础学JAVA]Java SE应用部分-25.多线程(03)_JAVA_32
解决这个问题我们需要使用到数据同步
同步代码块
[零基础学JAVA]Java SE应用部分-25.多线程(03)_JAVA_33
Java程序中分为四种代码块:
· 普通代码块
· 构造块
· static静态块
· 同步代码块

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