一:多线程执行的程序并不是同时执行的。
CPU给每个线程分配cpu时间片来实现多线程的机制。时间片是cpu给每个线程分配的时间。因为时间片非常短,所以cpu通过不停的切换线程执行,让我们感觉多个线程是同时执行的,时间片一般为几十毫秒。
二: 什么是上下文切换?
任务从保存到再加载的过程就是一次上下文切换。
三:上下文切换产生的问题?
影响多线程的执行速度。
四:并发执行不一定比串行执行快。因为线程有创建和上下文切换的开销。
五:测试案例:
package com.yykj.thread; /** * Created by admin on 2017/9/8. */ public class ConcurrencyTest { private static final long count=10000l; public static void main(String[] args){ } /** * @Title: 并执 * @Description: (并执) * @param null * @return * @author 陈晓阳 * @date 2017/9/8 * @throws */ private static void concurrency() throws InterruptedException{ long start= System.currentTimeMillis(); Thread thread=new Thread(new Runnable(){ @Override public void run() { 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.print("concurrency:"+time+"ms,b="+b); } /** * @Title: * @Description: (串执) * @param null * @return * @author 陈晓阳 * @date 2017/9/8 * @throws */ 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.print("serial:"+time+"ms,b="+b+",a="+a); } }
测试结果:
当并发执行累加操作不超过百万次时,速度会比串行累加操作要慢。