提高對cpu的利用率
1.程序是什麼?
--資源分配的基本單位--靜態單位
2.執行緒是什麼?
--排程執行的基本單位--動態單位
3.纖程/協程什麼?
答案肯定是否定的
首先簡單說明下計算機底層原理,cpu分為:alu,暫存器組(資料),pc(執行到哪條指令)
根據os執行緒排程演算法,當乙個執行緒執行完切換到另乙個執行緒時(t1,t2),t1(指令和資料放到快取),t2(指令和資料放到cpu),這是乙個迴圈的操作,cpu只進行切換,os進行排程.
執行緒切換.io等都會消耗資源,所以當你執行緒太多的時候會消耗大量的資源
下面我們看乙個列子
privatem1,m2,m3三個方法,我先簡單介紹下static
double nums = new
double
[1_0000_0000];
private
static random r = new
random();
private
static decimalformat df = new decimalformat("0.00");
static
}private
static
void
m1()
long end =system.currenttimemillis();
system.out.println("m1 time:" + (end - start) + " result:" +df.format(result));
}static
double result1 = 0.0, result2 = 0.0, result = 0.0;
private
static
void m2() throws
exception
});thread t2 = new thread(() ->
});long start =system.currenttimemillis();
t1.start();
t2.start();
t1.join();
t2.join();
result = result1 +result2;
long end =system.currenttimemillis();
system.out.println("m2 time:" + (end - start) + " result:" +df.format(result));
}private
static
void m3() throws
exception
});}
double result = 0.0;
long start =system.currenttimemillis();
for(thread t : threads)
for(thread t : threads)
for (int i = 0; i < results.length; i++)
long end =system.currenttimemillis();
system.out.println("m3 time:" + (end - start) + " result:" +df.format(result));
}public
static
void main(string args) throws
exception
m1:傻瓜式單執行緒相加
m2:兩個執行緒分別計算,然後相加
m3:一萬個執行緒,分別計算,然後相加
下面我們看下結果
這裡可以看到m3居然是m1的6倍,可見並不是執行緒數越大越好.
那麼問題來了,到底多少執行緒合適呢?
有乙個公式:
一共5中,我們下面看下列子
staticclass mythread extends
thread
}static
class myrun implements
runnable
}static
class mycall implements callable
}public
static
void main(string args) throws
exception );
executorservice executorservice =executors.newcachedthreadpool();
executorservice.execute(() ->);
future
result = executorservice.submit(new
mycall());
system.out.println("result:" +result.get());
executorservice.shutdown();
futuretask
futuretask = new futuretask<>(new
mycall());
newthread(futuretask).start();
string futuretaskresult =futuretask.get();
system.out.println("futuretaskresult:" +futuretaskresult);
}
多執行緒基礎知識
建立乙個序列佇列,該佇列中從方的都是要依次執行的任務,dispatch queue serial 表示序列佇列的標示 dispatch queue t serialqueue dispatch queue create serial dispatch queue serial 建立乙個並行佇列,並行...
多執行緒 基礎知識
1 建立執行緒 extends thread implements runnable 啟動執行緒 threadl類的start 執行緒完成 1 run 方法執行完成 2 丟擲乙個未處理的異常導致執行緒的提前結束 2 執行緒的狀態 新建立 執行緒被建立,但是沒有呼叫start方法 可執行 runnab...
c 基礎知識 多執行緒
執行緒被定義為程式的執行路徑。每個執行緒都定義了乙個獨特的控制流。如果您的應用程式涉及到複雜的和耗時的操作,那麼設定不同的執行緒執行路徑往往是有益的,每個執行緒執行特定的工作。執行緒是輕量級程序。乙個使用執行緒的常見例項是現代作業系統中並行程式設計的實現。使用執行緒節省了 cpu 週期的浪費,同時提...