Java是一種廣泛使用的面向對象編程語言,具有良好的跨平臺性。在Java中,并發(fā)和并行是兩個非常重要的概念,但是它們不是完全相同的概念。
并發(fā)是指在同一時間段內有幾個任務都在運行,但是這些任務可能會交替執(zhí)行而不是同時執(zhí)行。在Java中,可以使用線程來實現(xiàn)并發(fā)。線程是程序執(zhí)行的一條路徑,每個線程都擁有自己的棧、程序計數(shù)器、本地變量和寄存器等信息。當有多個線程同時運行時,它們可能會訪問共享的資源,例如內存、文件等,因此需要使用鎖等機制來保證數(shù)據(jù)的安全。
public class MyThread implements Runnable {
private int count = 0;
public void run() {
for (int i = 0; i< 5; i++) {
System.out.println(Thread.currentThread().getName() + " count:" + count);
count++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
Thread thread1 = new Thread(myThread, "Thread-1");
Thread thread2 = new Thread(myThread, "Thread-2");
thread1.start();
thread2.start();
}
}
在上面的代碼中,我們創(chuàng)建了一個MyThread類,實現(xiàn)了Runnable接口,并重寫了run方法。在run方法中,我們定義了一個count變量,然后讓兩個線程同時運行,在執(zhí)行過程中對count變量進行操作。可以看到,在count變量被兩個線程同時訪問的情況下,count變量輸出的結果并不是連續(xù)遞增的,這就是并發(fā)的特點。
而并行是指在同一時刻有多個任務同時運行,這些任務可以在多個CPU或者多核處理器上同時執(zhí)行。在Java中,可以使用并行流來實現(xiàn)并行計算。并行流是Java 8中引入的一種新的流,可以讓程序自動選擇并行執(zhí)行還是串行執(zhí)行。
public class ParallelStreamTest {
public static void main(String[] args) {
Listlist = new ArrayList<>();
for (int i = 0; i< 100000; i++) {
list.add(i);
}
long startTime1 = System.currentTimeMillis();
int sum = list.stream().reduce(0, Integer::sum);
long endTime1 = System.currentTimeMillis();
System.out.println("sum:" + sum + " time:" + (endTime1 - startTime1) + "ms");
long startTime2 = System.currentTimeMillis();
int sum2 = list.parallelStream().reduce(0, Integer::sum);
long endTime2 = System.currentTimeMillis();
System.out.println("sum2:" + sum2 + " time:" + (endTime2 - startTime2) + "ms");
}
}
在上面的代碼中,我們使用了Stream和ParallelStream兩種方式來統(tǒng)計100000個數(shù)的和。可以看到,使用Stream串行計算的時間比使用ParallelStream并行計算的時間要長很多,在多核處理器上并行計算可以顯著提高程序的運行效率。
綜上所述,Java中的并發(fā)和并行都可以讓任務在同一時間段內同時執(zhí)行,但是并發(fā)是指任務交替執(zhí)行,而并行是指任務同時執(zhí)行。在Java中實現(xiàn)并發(fā)可以使用線程,實現(xiàn)并行可以使用并行流。