1. 程式人生 > 其它 >1.執行緒和程序

1.執行緒和程序

1.java預設有兩個執行緒

    1. main執行緒
    2. 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優化】