我清楚地知道兩者之間的區別。
并發是交替執行多個任務,而并行是一次執行多個任務。
但是,此代碼存在混淆,因為某位講師的意見與我不同。
這是代碼:
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> System.out.println("T1"));
Thread t2 = new Thread(() -> System.out.println("T2"));
t1.start();
t2.start();
t1.join();
t2.join();
}
我認為運行此代碼multiple cores將運行并行,而不是并發,講師說并發。
如果并發不并行,是什么原因?
uj5u.com熱心網友回復:
并發是指多個任務的執行可以重疊。
并行性是任務的實際并行執行。所以多個任務同時運行。
例子:
您需要獲得新護照并準備一份報告。
沒有并發和沒有并行性:您首先獲得新護照,然后處理報告。
并發且無并行:當您在排隊等候護照時,您打開筆記本電腦并處理報告。輪到您時,您關閉筆記本電腦并處理新護照。稍后您繼續處理報告。所以任務是重疊的,但任務不是同時運行的。
并發性和并行性:您在撰寫報告時要求其他人獲取您的護照。所以實際上有 2 個任務同時運行。
關于示例:
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> System.out.println("T1"));
Thread t2 = new Thread(() -> System.out.println("T2"));
t1.start();
t2.start();
t1.join();
t2.join();
}
很明顯,t1/t2 是重疊的,因此它們是并發的。所以有并發。
如果這將在一臺只有單核且沒有超執行緒的古老筆記本電腦上運行,那么就不可能有并行性,因為任何時候都只能運行 1 個執行緒。
但是在現代 CPU 上,兩個執行緒可以并行運行,因為有多個內核。因此,如果 2 個執行緒同時運行,那么也存在并行性。
所以肯定存在并發性和潛在的并行性(取決于硬體)。
uj5u.com熱心網友回復:
首先,這更像是一個詞匯問題而不是編程問題。也許一個并不真正適用于 java 的。
java中的基本概念之一是我們嘗試撰寫獨立于平臺的代碼。我們不會針對特定硬體進行預優化。無論有多少處理器,相同的代碼都可以在任何系統上運行。有一個 JIT(即時)編譯器,一旦知道硬體,它將在運行時重寫代碼以優化它。
在java中,我們對活動核心的數量幾乎沒有控制。
因此,換句話說,我們不區分“并行”、“并發”或“多執行緒”。這些詞只是互換使用。
話雖如此,官方教程說“并發”甚至可以在只有 1 個內核的系統上實作。這意味著功能可以中途中斷,然后再恢復。而且它發生得如此之快且頻繁,以至于即使執行緒在同一個核心上運行,它們似乎也完全并行運行。
您通常不知道何時/何地會發生這種情況。因此,synchronize即使在單核系統上,您也需要關鍵字和其他鎖定策略。
最后,“并行”和“并發”只是英文單詞。“同時”:
1:同時操作或發生。2a:并行運行。b :收斂特指:在一個點上相遇或相交。3:協同作用。
uj5u.com熱心網友回復:
并發是交替執行多個任務,而并行是一次執行多個任務。
幾十年來我一直在做執行緒編程,但我從未聽說過這種區別。互聯網說并發是可以在應用程式中同時(同時)運行的任何任務,而并行是當您同時多次運行同一任務時。因此,同時運行同一任務的多個副本是并行性。無論哪種情況,我都不會爭論語意——尤其是與教授:-)。
讓我們看一下代碼:
Thread t1 = new Thread(() -> System.out.println("T1"));
Thread t2 = new Thread(() -> System.out.println("T2"));
t1.start();
t2.start();
t1.join();
t2.join();
我認為在多個內核上運行這段代碼會以并行方式運行,而不是并發,講師說并發。
它當然是并發的。這 2 個執行緒可以(盡管它們可能不會)同時運行。作為記錄,由于執行緒競爭條件,它可能是t1或者t2可能開始運行并且可能在另一個開始之前完成。另一個問題是System.out該類synchronized意味著執行println(...)陳述句的第二個執行緒將被第一個執行緒阻塞,因此永遠不會同時列印輸出。但我挑剔。
使用并發和并行的互聯網定義,我會說它不是并行,因為它不是同一個作業。如果您Runnable在 2 個不同的執行緒中執行相同的操作,那么它會是。如果您將代碼更改為以下內容,再次使用互聯網定義,那么它將是并行性(以及并發性):
Runnable job = () -> System.out.println("T" Thread.currentThread().getId());
Thread t1 = new Thread(job);
Thread t2 = new Thread(job);
...
希望這可以幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/520370.html
標籤:爪哇多线程并发并行处理
