课程内容:
-
线程的概念
-
引用多线程的原因?
-
如何实现线程?
-
如何控制线程?
-
线程类其它常用方法
线程的概念
-
线程所在包:java.lang.Thread
-
理解程序 进程 线程之间的区别:
程序: 保存在物理介质中的代码片段
进程: 一旦程序运行起来 就变成了操作系统当中的一个进程
进程 = 进行当中的程序
线程: 线程是进程当中更加微观的概念
程序运行当中一条独立的执行线索
而多线程编程 就是让程序当中同时拥有多条彼此独立的执行线索
从而可以同一时间完成多项任务
同一时间执行多个操作
同一时间服务多个用户 -
线程的五大状态 == 生命周期
新生 就绪 运行 消亡
NewBorn Runnable Running Dead
阻塞
Blocking
*:CPU时间片 = CPU让一个线程执行一次的时间单位
引用多线程的原因?
我们不否认 在某些场景下 使用多线程的确可以提高效率
但是使用多线程的根本目的
是为了让程序当中拥有多条独立的执行线索
从而同时完成多项任务(同时服务多个用户)
如何实现线程?
1.extends Thread
@Override
public void run(){
给线程布置任务;
}
2.implements Runnable
@Override
public void run(){
给线程布置任务;
}
3.欠着
如何控制线程?
0.setPriority(int):设置线程的优先级别
可选范围1-10 默认优先级为5
优先级高代表抢到时间片的概率高而已
先设置优先级 再拿对象.start()启动
1.static sleep(long): 让当前线程休眠指定的毫秒数(主动进入阻塞状态)
Thread.sleep(5000);
2.static yield():让当前线程直接放弃时间片返回就绪
Thread.yield();
3.join():让当前线程邀请调用方法的那个进程优先执行(主动进入阻塞状态)
在被邀请的进程执行结束之前 当前进程一直处于阻塞态
et.join()
该方法出现在哪个线程当中 那个线程就是当前线程
谁主动调用join()方法 谁就是被邀请优先执行的进程
*:线程章节所有主动进入阻塞状态的方法 都必须进行异常处理
因为它们都有throws InterruptedException声明
而InterruptedException 属于非运行时异常
*: 线程章节所有的静态方法 不要关注谁调用方法
而要关注 调用出现在哪个线程的线程体
出现在谁的线程体 就是操作那个线程
[别看谁点 看写哪]
*: 一个静态方法被调用了 方法体当中没有任何办法得到调用方法的对象
无论谁调用的方法 都等价于类名直接调用的
练习题:
一个向往美好的和尚 与 诸多动物一起旅游的故事
- 西游记
故事当中涉及到如下多个线程
有个师傅线程 打印999次 "Only You能伴我取西经"
有个悟空线程 打印888次 "俺老孙来也"
有个悟能线程 打印777次 "分行李吧 回高老庄"
有个悟净线程 打印666次 "大师兄不好了 师傅被妖怪抓走了"
*: 师傅天天逼逼叨叨特别烦人 请让他优先级最低
setPriority(1);
*: 猴哥想要给师弟们更多的表现机会 前三次获得时间片
他会主动放弃 yield();
*: 八戒很懒 干活之前先休眠300毫秒
sleep();
*: 悟净很依赖猴哥 猴子不死 他就不上
join();
线程类其它常用方法
0.setName() + getName(): 设置和得到线程的名字标签:调用,Thread,day4,线程,当中,阻塞状态,方法 From: https://www.cnblogs.com/zhaodenghui33/p/18183304
1.static activeCount(): 得到程序当中所有活跃线程的总数
活跃线程:就绪+运行+阻塞
Thread.activeCount()
*:能够协助程序员统计在线人数
2.setDaemon(true): 设置线程成为守护线程
守护线程:是为其它线程提供服务的
当程序当中只剩下守护线程的时候
守护线程会自行消亡
1> 守护线程通常都是无限循环 防止其过早消亡
2> 设置成为守护线程的操作必须早于它的start()
否则不但会操作失败 还会导致运行时异常IllegalThreadStateException
3> 守护线程应该具有较低的优先级别 防止与核心业务抢时间片
3.interrupt(): 中断线程的阻塞状态
et.interrupt();
该方法出现在哪个线程当中 哪个线程就是当前主动出手的线程
谁主动调用interrupt()方法 谁就是被打断阻塞状态的进程
4.static currentThread() : 获得当前正在执行的线程对象
1.可以在主方法当中用来获得主线程对象...
Thread zxc = Thread.currentThread();
2.可以出现在run()调用的其它方法中 用于获得当前线程是谁...
X.它不该直接出现在run()当中
因为得到的一定等价于this
5.CountDownLatch => CountDown 倒数(倒计时) Latch 插销(门闩)
构造方法:
CountDownLatch latch = new CountDownLatch(门上的插销个数);
传参指定总共设置多少个门闩
核心方法:
latch.await() : 等待开门(主动进入阻塞状态)
latch.countDown() : 打开一个插销