关于线程的知识,你知道多少?( 三 )


对于单核 CPU 来说 , 是无法做到真正的多线程的;但是对于多核 CPU 来说 , 在一段时间内 , 可以执行多个任务的 , 由于 CPU 执行代码时间很快 , 所以两个线程的代码交替执行看起来像是同时执行的一样 , 具体执行某段代码多少时间 , 就和分时机制系统有关了 。
分时机制系统 , 简单的说 , 就是将 CPU 时间划分为多个时间片 , 操作系统以时间片为单位来执行各个线程的代码 , 越好的 CPU 分出的时间片越小 。
例如某个时段 ,  CPU 将 1 秒划分成 50 个时间片 , 1 个时间片耗时 20 ms , 每个时间片均进行线程切换 , 也就是说 1 秒可以执行 50 个任务 , 给人的感觉好像计算机能同时处理多件事情 , 其实是 CPU 执行任务速度太快给人产生的错觉感 。
3.2、实现 Runnable 接口 , 然后通过 Thread 类来启动介绍/** * 实现 Runnable 接口 */public class Thread2 implements Runnable{@Overridepublic void run() {for (int i = 0; i < 5; i++) {String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date());System.out.println(time + " 当前线程:" + Thread.currentThread().getName() + " , 正在运行");}}}/** * 创建一个测试类 */public class ThreadTest2 {public static void main(String[] args) {// 通过一个Thread来启动线程Thread thread2 = new Thread(new Thread2());thread2.start();for (int i = 0; i < 5; i++) {String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date());System.out.println(time + " 当前线程:" + Thread.currentThread().getName() + " , 正在运行");}}}输出结果:
2023-08-23 18:30:28:664 当前线程:Thread-0 , 正在运行2023-08-23 18:30:28:666 当前线程:Thread-0 , 正在运行2023-08-23 18:30:28:666 当前线程:Thread-0 , 正在运行2023-08-23 18:30:28:664 当前线程:main , 正在运行2023-08-23 18:30:28:666 当前线程:Thread-0 , 正在运行2023-08-23 18:30:28:667 当前线程:Thread-0 , 正在运行2023-08-23 18:30:28:668 当前线程:main , 正在运行2023-08-23 18:30:28:668 当前线程:main , 正在运行2023-08-23 18:30:28:668 当前线程:main , 正在运行2023-08-23 18:30:28:668 当前线程:main , 正在运行效果跟上面介绍的一样 , 如果循环的打印次数越多 , 效果越明显!
四、线程状态下图是一张从操作系统角度划分的线程模型状态!

关于线程的知识,你知道多少?

文章插图
图片
线程被分为五种状态 , 各个状态说明如下:
  • 1.新建状态:表示创建了一个新的线程对象 , 例如Thread thread = new Thread()
  • 2.就绪状态:比如调用线程的start()方法 , 就会处于就绪状态 , 也被称为可执行状态 , 随时可能被 CPU 调度执行
  • 3.运行状态:获得了 CPU 时间片 , 执行程序代码 。需要注意的是 , 线程只能从就绪状态进入到运行状态
  • 4.阻塞状态:因为某种原因出现了阻塞 , 线程放弃对 CPU 的使用权 , 停止执行 , 直到阻塞事件结束 , 重新进入就绪状态才有可能再次被 CPU 调度 。
  • 5.结束状态:线程里面的方法正常执行结束或者因为某种异常退出了 , 则该线程结束生命周期
针对操作系统的线程模型 , Java 进行部分封装和扩充 , JVM 中的线程状态总共有六种 , 它们之间的关系 , 可以用如下图来表示:
关于线程的知识,你知道多少?

文章插图
图片
各个状态说明如下:
1.新建状态(NEW):新创建了一个线程对象
2.运行状态(RUNNABLE):Java 线程中将就绪状态和运行中两种状态 , 笼统的称为“运行” 。线程对象创建后 , 调用了该对象的start()方法 , 该线程处于就绪状态 , 获得 CPU 时间片后变为运行中状态
3.阻塞状态(BLOCKED):因为某种原因 , 线程放弃对 CPU 的使用权 , 停止执行 , 直到进入就绪状态才有可能再次被 CPU 调度 。比如线程在获得synchronized同步锁失败后 , 会把线程放入锁池中 , 线程进入同步阻塞状态 。


推荐阅读