对于单核 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.结束状态:线程里面的方法正常执行结束或者因为某种异常退出了 , 则该线程结束生命周期

文章插图
图片
各个状态说明如下:
1.新建状态(NEW):新创建了一个线程对象
2.运行状态(RUNNABLE):Java 线程中将就绪状态和运行中两种状态 , 笼统的称为“运行” 。线程对象创建后 , 调用了该对象的start()方法 , 该线程处于就绪状态 , 获得 CPU 时间片后变为运行中状态
3.阻塞状态(BLOCKED):因为某种原因 , 线程放弃对 CPU 的使用权 , 停止执行 , 直到进入就绪状态才有可能再次被 CPU 调度 。比如线程在获得synchronized同步锁失败后 , 会把线程放入锁池中 , 线程进入同步阻塞状态 。
推荐阅读
- 四层负载均衡的 NAT 模型与 DR 模型推导
- 详解API接口如何安全的传输数据
- Sonic: Go语言的超级JSON库,解析与编码速度狂飙
- EasyNetQ库:让你的分布式系统消息开发快人一步!
- C# 中的 ref 已经被放开,或许你已经不认识了
- Oracle数据库分区技术:优化大型数据集的存储效率!
- Docker容器中的Postgresql备份脚本异常解决办法
- 目前有哪些比较成功的人工智能应用?
- 为什么色准越高的显示设备就越贵
- AI要被卡脖子了?训练大模型的数据或在2026年耗尽
