原有的执行流(调度单位)因为某些事件堵塞了,同时我们还需要运行一些其他的代码时
需要一些调度单位加速我们的代码运行速度
Thread类是JVM用来管理线程的类,每个线程都有唯一的Thread对象关联。
例子:
Thread对象也可以当做Runnable对象使用多线程的现象具有随机性,随机性的来源——调度机制
start() vs run()
重写run方法,是提供线程需要做的事情,调用start是真正独立执行。启动线程需要调用start方法
绝大多数我们的线程代码,是跑在一个死循环中的
1、通过一些共享数据让其停止
2、Thread类提供了方法,使得其停止
可以认为,每个Thread对象中,都有一个类似变量让其停止。
其他线程可以调用 . interrupt();
在需要停止的线程内部,通过调用 boolean Thread.interrupted();
在其内部可能有两种状态:
1、调用类似的sleep方法,处于阻塞状态,会收一个InterruptedException异常,表示需要其停止。
2、处于就绪状态,正在执行代码,
Thread.interrupted()返回true,表示需要其停止
只能建议停止,不能强制停止
Thread.interrupted()读取一次后便会清除其中断标志
使用 .isInterrupted()在判断指定线程的中断标志设置不清除中断标志。
有时候,我们需要等待一个线程完成它的工作后,才能进行下一步工作,例如:甲线程等待乙线程结束。
使用 . join();
例如:
理论上的线程状态分为:初识、就绪、运行和停止
实际上在Java中分为:NEW、RUNNABLE、TERMINATED、BLOCKED、WAITING、TIMED_WAITING
alive:哪些状态是alive的?
RUNNABLE、TERMINATED、BLOCKED、WAITING、TIMED_WAITING
(就绪、运行、阻塞)
daemon: 后台线程 vs 默认
后台线程会执行一些不影响的主流线程,但需要默默工作的事情:1、垃圾回收机制、2、听歌背后的下载线程
设置:
后台线程:thread.setDaemon(true);
前台线程:thread.setDaemon(false);
什么时候一个JVM进程结束:
所有前台线程都运行结束(1、后台线程不影响,2、和是不是主线程无关)
1、Thread.sleep(毫秒); == TimeUtil.MILISECONDS.sleep(毫秒);
2、Thread thread = Thread.currentThread();
返回调用该方法的线程的对象的引用
3、Thread.yield(); 主动放弃CPU;
例如:
jconsole工具 官方安装jdk中自带
1、启动程序(有线程在跑的程序)
2、打开jconsole工具(在jdk安装目录下,bin目录下面的 jconsole.exe)
3、选择要观察的程序
附一张自己面试前准备的脑图:
面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典
Java核心知识整理
Spring全家桶(实战系列)
Step3:刷题
既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。
以下是我私藏的面试题库:
很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。
由于篇幅问题,需要的朋友三连加评论点击这里领取