# Java進程、線程、并行與并發之間的關系
## 1. 基本概念解析
### 1.1 進程(Process)
進程是操作系統資源分配的基本單位,具有獨立的內存空間。在Java中,每個運行的JVM實例都是一個獨立的進程。
```java
// 通過Runtime啟動新進程示例
Process process = Runtime.getRuntime().exec("notepad.exe");
特點: - 擁有獨立的地址空間 - 進程間通信(IPC)成本較高 - 上下文切換開銷大
線程是CPU調度的基本單位,共享進程的內存空間。Java通過java.lang.Thread類實現線程機制。
// Java線程創建示例
Thread thread = new Thread(() -> {
System.out.println("Thread running");
});
thread.start();
特點: - 共享進程資源 - 上下文切換成本低 - 需要處理同步問題
指多個任務同時執行,需要多核CPU支持。Java中可通過: - 多線程(單機多核) - 分布式計算(多機協作)
// 并行流示例
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
numbers.parallelStream().forEach(System.out::println);
指多個任務交替執行,在單核CPU上通過時間片輪轉實現。Java主要通過線程機制實現。
// 并發示例:兩個線程交替執行
new Thread(task1).start();
new Thread(task2).start();
| 維度 | 進程 | 線程 |
|---|---|---|
| 資源占用 | 獨立內存空間 | 共享進程內存 |
| 創建開銷 | 大(需分配資源) | ?。▋H需棧和PC) |
| 通信方式 | IPC(管道、Socket等) | 共享變量 |
| 可靠性 | 一個崩潰不影響其他進程 | 一個線程崩潰可能導致整個進程終止 |
關系圖示:
進程A
├── 線程1(共享堆、方法區)
├── 線程2(共享堆、方法區)
└── 線程3(共享堆、方法區)
進程B(獨立內存空間)
| 特性 | 并行 | 并發 |
|---|---|---|
| 硬件要求 | 多核/多CPU | 單核即可 |
| 本質 | 物理同時 | 邏輯同時 |
| 目標 | 提高吞吐量 | 提高資源利用率 |
| Java實現 | ForkJoinPool、并行流 | 普通線程池 |
經典案例: - 并發:單核CPU處理100個HTTP請求 - 并行:8核CPU同時處理8個計算任務
操作系統
├── 進程A(Java應用)
│ ├── 線程池(并發處理請求)
│ └── ForkJoinPool(并行計算)
└── 進程B(數據庫服務)
class MyThread extends Thread {
public void run() {
// 線程邏輯
}
}
class MyRunnable implements Runnable {
public void run() {
// 線程邏輯
}
}
ExecutorService pool = Executors.newFixedThreadPool(4);
pool.submit(() -> System.out.println("Task executed"));
synchronizedpublic synchronized void criticalSection() {
// 臨界區代碼
}
ReentrantLockLock lock = new ReentrantLock();
lock.lock();
try {
// 臨界區
} finally {
lock.unlock();
}
ConcurrentHashMapMap<String, String> map = new ConcurrentHashMap<>();
class FibonacciTask extends RecursiveTask<Integer> {
protected Integer compute() {
// 分治邏輯
}
}
list.parallelStream()
.filter(...)
.map(...)
.collect(...);
Tomcat線程池(并發處理HTTP請求)
→ 業務邏輯線程(并發)
→ 數據庫連接池(并發訪問)
# Tomcat線程池配置
server.tomcat.max-threads=200
// 使用Parallel Stream處理大數據集
bigDataList.parallelStream()
.map(transformFunction)
.reduce(mergeFunction);
[訂單服務] JVM進程
[支付服務] JVM進程
[庫存服務] JVM進程
線程數量黃金公式:
N_threads = N_cpu * U_cpu * (1 + W/C)
N_cpu: CPU核心數
U_cpu: 目標CPU利用率(0 < U <= 1)
W/C: 等待時間與計算時間比
避免常見陷阱:
診斷工具: “`bash
jstack
# 性能分析 VisualVM / Arthas
## 6. 未來發展趨勢
1. 協程(虛擬線程):
```java
// Java 19+ 虛擬線程預覽
Thread.startVirtualThread(() -> {
System.out.println("Virtual thread");
});
響應式編程:
Flux.range(1, 10)
.parallel()
.runOn(Schedulers.parallel())
.subscribe(...);
云原生下的進程模型:
總結:Java中的進程提供資源隔離,線程實現輕量級并發,并行是并發的物理實現?,F代Java應用需要根據場景靈活組合這些特性,在保證正確性的前提下追求性能最大化。 “`
注:本文實際約1800字,完整版可擴展以下內容: 1. 增加更多代碼示例(如CompletableFuture實現并發) 2. 補充操作系統調度細節 3. 添加性能測試對比數據 4. 擴展分布式場景討論
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。