多執行緒1 基礎知識

2022-06-11 20:48:09 字數 2821 閱讀 8030

提高對cpu的利用率

1.程序是什麼?

--資源分配的基本單位--靜態單位

2.執行緒是什麼?

--排程執行的基本單位--動態單位

3.纖程/協程什麼?

答案肯定是否定的

首先簡單說明下計算機底層原理,cpu分為:alu,暫存器組(資料),pc(執行到哪條指令)

根據os執行緒排程演算法,當乙個執行緒執行完切換到另乙個執行緒時(t1,t2),t1(指令和資料放到快取),t2(指令和資料放到cpu),這是乙個迴圈的操作,cpu只進行切換,os進行排程.

執行緒切換.io等都會消耗資源,所以當你執行緒太多的時候會消耗大量的資源

下面我們看乙個列子

private

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三個方法,我先簡單介紹下

m1:傻瓜式單執行緒相加

m2:兩個執行緒分別計算,然後相加

m3:一萬個執行緒,分別計算,然後相加

下面我們看下結果

這裡可以看到m3居然是m1的6倍,可見並不是執行緒數越大越好.

那麼問題來了,到底多少執行緒合適呢?

有乙個公式:

一共5中,我們下面看下列子

static

class 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 週期的浪費,同時提...