第十七章 多线程基础
1.线程介绍
1.程序进程线程
2.并发并行
下面写一个代码查看当前电脑有多少CPU
2.线程使用
1.继承Thread创建线程
一秒 = 1000毫秒
2.多线程机制
下面是子线程
下面是主线程
主线程和子线程交替执行
下面使用JConsole监控线程执行情况
程序在执行时,点击Terminal
执行jconsole
连接Thread01这个程序
连接上之后切换到线程
其中可以观察线程运行情况
主线程可以开启多个子线程,子线程中也可以再开子线程
3.为什么是start
cat.run()会先将run方法执行完,才去执行下面的代码,是属与串行化执行,并不是真正的多线程
4.Runnable创建线程
但是这里用不了start方法
5.多个子线程案例
交替进行
6.多线程售票问题
Thread实现
发现问题,票数为0后,还在继续卖票
原因是三个线程同时瞬间执行代码
Runnable实现
这里就不用静态属性了,因为这里我们只用new一次SellTicket02属性就行了,其他代码不变
这里是将同一个对象,放到其中,故肯定是三个线程
但这种方法会出现同样的超买问题,原因与上面一样
7.通知线程退出
10秒后程序退出
3.线程方法
1.线程中断
如果想要提前终止它的休眠
本身上面应该休眠20秒但是提前被终止了
2.线程插队
目前没有加任何额外的操作,主线程和子线程来回交替运行
下面我们加入join操作,使主线程在运行5次后,让子线程先执行完
下面是yield的情况
这里没有让成功
3.线程插队练习
4.守护线程
下面举一个案例
比如我们的m是一个主线程,而t1是一个无限循环的子线程
当主线程m结束时,我们的子线程t1还是在不断执行的
现在我们将t1做成一共守护线程,即在主线程退出时,我们的t1也退出
下面将子线程设为守护线程
5.线程7大状态
官方(上图)是有六种状态
但有地方将Runnable细分为Ready和Running两种
4.Synchronized
[ˈsɪŋkrənaɪzd]
1.线程同步机制
我们使用上面的售票问题来举例
这里因为有三个线程,所以输出了三次售票结束
5.互斥锁
锁是存在于对象中的
下面是代码块的形式加锁
5
6
如果在静态方法中写入同步代码块,如果要在本类中加锁,不能写this(静态/类方法不能使用this),这里直接写出本类名即可
多个线程的锁的对象必须是同一个
比如下面如果new了两个SellTicket01对象,再分别去调用m1,就错了,锁不住
因为其中的this代表了两个不同的SellTicket01对象(不懂重新看视频)
这里如果想要锁住就得加个static
6.线程死锁
程序就会卡在这边动不了,陷入死锁(注意:这里的o1,o2是静态的,所有A和B用的是同一个)
7.死锁
线程被挂起后仍然处于Runnable状态
8.线程家庭作业1
9.线程家庭作业2
这里出现了问题,出现多个线程同时操作代码的问题,加一个Synchronized即可