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);
}
}
測試結果:
當併發執行累加操作不超過百萬次時,速度會比序列累加操作要慢。