理解上下文切换
即使是单核处理器也支持多线程执行代码,CPU通过每个线程分配CPU时间片来实现这个机制.时间片是CPU分配给多个线程的时间,因为时间片非常短,所以CPU通过不停的切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms).
CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务.但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务是,可以再加载这个任务状态.所以任务从保存到再加载的过程就是一次上下文切换,上下文切换会影响多线程的执行速度!!!
多线程一定快吗???
废话不多说通过代码来说话!!!
public class ConcurrencyTest {
private static final long count = 10001;
public static void main(String[] args) throws InterruptedException {
concureency();
serial();
}
private static void concureency() throws InterruptedException {
long start = System.currentTimeMillis();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
int a = 0;
for(long i = 0; i < count; i++) {
a += 5;
}
}
});
thread.start();
int b = 0;
for(long i = 0; i < count; i++) {
b --;
}
thread.join();
long time = System.currentTimeMillis() - start;
System.out.println("concureency :" + time+"ms,b="+b);
}
private static void serial() {
long start = System.currentTimeMillis();
int a = 0;
for (long i = 0; i < count; i++) {
a += 5;
}
int b = 0;
for (long i = 0; i < count; i++) {
b--;
}
long time = System.currentTimeMillis() - start;
System.out.println("serial:" + time+"ms,b="+b+",a="+a);
}
}
查看运行结果:
count = 10001时
concureency :1ms,b=-10001
serial:0ms,b=-10001,a=50005
此时多线程相比下是比较慢
count = 1000000001时
concureency :476ms,b=-1000000001
serial:712ms,b=-1000000001,a=705032709
此时多线程并发比串行快
所以答案是不一定的!!!那么为什么会是这样的呢??
因为线程有创建和上下文切换的开销