1.執行緒和程序
阿新 • • 發佈:2022-04-19
1.java預設有兩個執行緒:
-
- main執行緒
- GC垃圾回收執行緒
2.java真的可以開啟執行緒麼?
答案是否定的,其實底層本地去呼叫是c++的方法,因為java是執行在虛擬機器上的,無法操作硬體!
原理如下:
public synchronized void start() { if (threadStatus != 0) throw new IllegalThreadStateException(); group.add(this); boolean started = false; try { //重點:執行緒內部呼叫的是start0的本地方法 start0(); started = true; } finally { try { if (!started) { group.threadStartFailed(this); } } catch (Throwable ignore) { } } } //呼叫的其實是內部的start0方法 private native void start0();
3.併發、並行
3.1併發:多個執行緒操作同一個資源
CPU 一核情況下,模擬出來多條執行緒,快速交替,營造出共同進行的假象
3.2並行:
CPU 多核情況下,多個執行緒可以同時執行!
程式獲取cpu核數:
System.out.println("cpu核數:"+ Runtime.getRuntime().availableProcessors());
如何提高執行效率呢:
1.併發:CPU資源的充分利用
2.並行:執行緒池
多執行緒在多核cpu下的執行速率快於單執行緒,因為多核cpu下,多個執行緒是同時執行的, 但是單核cpu下,多執行緒的執行速率慢於單執行緒的速率,因為單核下,多執行緒是交替進行,會有上下文的切換!
結論:
1.單核CPU下,多執行緒不能實際的提高程式執行效率,只是為了能夠在不同的任務間切換,不同執行緒輪流使用CPU, 會涉及到下上文切換,會損失一部分的速率
2.多核cpu可以並行跑多個執行緒,但是是否能夠提升效率還得分情況:
2.1 有的任務:經過精心設計,將任務拆分,並行執行,當然可以提高程式得執行效率,但是不是所有得任務都能拆分
3.IO操作不佔用CPU,只是我門一半拷貝檔案使用的是【阻塞IO】,這時相當於執行緒雖然不用cpu,但需要一直等待IO結束,沒能充分利用執行緒 後面會有【非阻塞IO】和【非同步IO優化】