JAVA 线程上下文切换
并发编程的目的是为了让程序运行得更快,但是并不是启动更多的线程就能让
程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务
让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题、死锁的问
题,以及受限于硬件和软件的资源限制问题,本文要研究的是上下文切换的问
题。
什么是上下文切换
即使是单核 CPU 也支持多线程执行代码,CPU 通过给每个线程分配 CPU 时间
片来实现这个机制。时间片是 CPU 分配给各个线程的时间,因为时间片非常短,
所以 CPU 通过不停地切换线程执行,让我们感觉多个线程时同时执行的,时间
片一般是几十毫秒(ms)。
CPU 通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换
到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这
个任务时,可以再次加载这个任务的状态,从任务保存到再加载的过程就是一
次上下文切换。
这就像我们同时读两本书,当我们在读一本英文的技术书籍时,发现某个单词
不认识,于是便打开中英文词典,但是在放下英文书籍之前,大脑必须先记住
这本书读到了多少页的第多少行,等查完单词之后,能够继续读这本书。这样
的切换是会影响读书效率的,同样上下文切换也会影响多线程的执行速度。
上下文切换代码测试
下面的代码演示串行和兵法执行并累加操作的时间:
public class ContextSwitchTest
{
private static final long count = 10000;
public static void main(String[] args) throws Exception
{
concurrency();
serial();
}
评论0
最新资源