1. 程式人生 > >java 併發程式設計之上下文切換

java 併發程式設計之上下文切換

 一:多執行緒執行的程式並不是同時執行的

      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);
   }
}

測試結果:

當併發執行累加操作不超過百萬次時,速度會比序列累加操作要慢。