首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

程序员必读,原创小故事,多线程你所不知道的生命史

武汉加油,早日复工。

1 cpu是大家的

在一个屋子里,里面有10个人,房间里面空气混浊,无法呼吸,只有一个仅能供一个人呼吸的小洞。于是每人轮流使用小洞5秒钟进行呼吸,确保每个人都能活下去。

Java多线程编程里面,线程就像那10个人,可能更多,成百上千个线程。但cpu小洞只有一个。所有线程都只能抢占一个cpu的使用权。而且cpu也只能同时供一个线程使用(多核cpu就类似有多个小洞)。cpu是大家的,线程为了完成任务,就必须去竞争cpu的使用权。

2 每个人都有份

还是刚才的小屋和小洞,每个人只能使用小洞5秒钟,然后必须让出小洞,给下一个人使用。否则如果一个人使用的时间太长,其他等待的人就死定了。

同理,每个线程只是使用很小的一个时间片段,不论线程是否把其任务完成,都要记住运行到哪一步,然后让出cpu使用权,给下一个线程使用。确保cpu的使用权,人人有份。

3 线程的生命周期

现在请看下面这张线程的运行状态图,对应上面介绍的情况就很好理解了。

我们new了一个java线程对象的时候,并没有创建新的线程(此线程非彼线程)。只有当调用start方法启动时,才会创建一个新的线程。线程创建好之后,进入就绪状态,也就是排队竞争cpu使用权的时候。毕竟cpu只有一个,而线程有千万个。如下图,小编电脑的线程数据。

如果你想让线程数上去,就用小编前面文章中循环创建线程的方法试验下。当争取到cpu的使用权时,线程进入运行状态。但cpu不会让你把所有事情做完,而是让线程做一点点事请,然后就去为下一个线程服务。cpu离开后,当前线程就进入阻塞状态了。直到线程阻塞接触,重新进入就绪状态,争取下一次cpu的使用权,循环往复,直至线程把所有工作做完。

4 原理分析-为什么是这样的

为什么不让一个线程执行完,再去执行下一个线程呢?这里就涉及到运行速度的概念。cpu的运行速度快,其次是内存,再次是硬盘。cpu处理程序的过程中,程序需要反复去操作内存和硬盘。如果让cpu一直为一个线程服务,就会出现,cpu工作一天,然后要等一百天才能去做下一件事情,这一百天就是操作去内存存取数据。能者多劳,就像老板给优秀的员工施加更多工作压力一样。操作系统就会让cpu去为其他准备就绪的线程工作。

这也是大家为什么能边看文章,边听英语,边玩微信,还边玩游戏的原因。因为有一个勤劳的cpu在不辞疲倦的为我们工作。

5 结束语

人人都是程序员,感谢您的阅读,欢迎关注。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200301A04L3B00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券