[TOC]
# 1. 并發工具
## 1.1. 并發應用方法和使用場景
| 應用方法 | 使用場景 |
| --- | --- |
| java.util.concurrent.ConcurrentHashMap、java.util.concurrent.CopyOnWriteArrayList:創建并發容器、線程安全訪問并發容器 | 多線程情況下的數據共享和協同處理? |
|java.util.concurrent.ThreadPoolExecutor、java.util.concurrent.Executors :創建線程池、提交任務、關閉線程池| 多線程情況下的任務處理和資源管理|?
|java.util.concurrent.atomic.AtomicInteger、java.util.concurrent.atomic.AtomicLong:創建原子變量、線程安全訪問原子變量| 多線程情況下的變量更新和同步|
|java.util.concurrent.locks.ReentrantLock、java.util.concurrent.locks.ReentrantReadWriteLock :創建鎖、獲取鎖、釋放鎖|多線程情況下的共享資源訪問控制 |?
|java.util.concurrent.CountDownLatch、java.util.concurrent.CyclicBarrier、java.util.concurrent.Semaphore、java.util.concurrent.Exchanger :創建并發工具類、使用并發工具類| 多線程情況下的同步和通信|
## 1.2. Java 并發工具包列表
| 技術邊界 | 特性 | 使用場景 | 應用方法 | 項目結構關系 | 實施關鍵流程 |
| --- | --- | --- | --- | --- | --- |
| 并發容器 | 支持高并發讀寫操作 | 多線程情況下的數據共享和協同處理 | java.util.concurrent.ConcurrentHashMap、java.util.concurrent.CopyOnWriteArrayList | 與項目中的數據結構和算法相關 | 創建并發容器、線程安全訪問并發容器 |
| 線程池 | 支持線程池的創建和管理 | 多線程情況下的任務處理和資源管理 | java.util.concurrent.ThreadPoolExecutor、java.util.concurrent.Executors | 與項目中的任務調度和資源管理相關 | 創建線程池、提交任務、關閉線程池 |
| 原子變量 | 支持線程安全的原子操作 | 多線程情況下的變量更新和同步 | java.util.concurrent.atomic.AtomicInteger、java.util.concurrent.atomic.AtomicLong | 與項目中的數據共享和協同處理相關 | 創建原子變量、線程安全訪問原子變量 |
| 鎖 | 支持線程同步和互斥訪問 | 多線程情況下的共享資源訪問控制 | java.util.concurrent.locks.ReentrantLock、java.util.concurrent.locks.ReentrantReadWriteLock | 與項目中的資源和數據訪問控制相關 | 創建鎖、獲取鎖、釋放鎖 |
| 并發工具類 | 支持高級并發編程操作 | 多線程情況下的同步和通信 | java.util.concurrent.CountDownLatch、java.util.concurrent.CyclicBarrier、java.util.concurrent.Semaphore、java.util.concurrent.Exchanger | 與項目中的并發編程和通信相關 | 創建并發工具類、使用并發工具類 |
## 1.3. 應用場景:
* 并發容器:需要在多線程情況下進行數據共享和協同處理的場景,如緩存管理、數據統計和日志記錄等。
* 線程池:需要進行多線程任務處理和資源管理的場景,如網絡服務、數據處理和計算密集型任務等。
* 原子變量:需要進行線程安全的原子操作的場景,如計數器、標志位和統計數據等。
* 鎖:需要進行線程同步和互斥訪問的場景,如共享資源的訪問控制、線程間的協同處理等。
* 并發工具類:需要進行高級并發編程操作和線程間通信的場景,如等待多個線程完成某項操作、線程間交換數據等。
## 1.4. 特性:
* 并發容器:支持高并發讀寫操作,具有較高的性能和可擴展性。
* 線程池:支持線程池的創建和管理,可以提高多線程任務處理的效率和可靠性。
* 原子變量:支持線程安全的原子操作,可以提高多線程共享變量的安全性和性能。
* 鎖:支持線程同步和互斥訪問,可以提高多線程訪問共享資源的安全性和可靠性。
* 并發工具類:支持高級并發編程操作和線程間通信,可以提高多線程協同處理的效率和可靠性。
## 1.5. 應用方法:
* 并發容器:使用ConcurrentHashMap、CopyOnWriteArrayList等類創建并發容器,使用put()、get()等方法進行線程安全的讀寫操作。
* 線程池:使用ThreadPoolExecutor、Executors等類創建線程池,使用submit()、execute()等方法提交任務,使用shutdown()、shutdownNow()等方法關閉線程池。
* 原子變量:使用AtomicInteger、AtomicLong等類創建原子變量,使用get()、set()等方法進行線程安全的讀寫操作。
* 鎖:使用ReentrantLock、ReentrantReadWriteLock等類創建鎖,使用lock()、unlock()等方法獲取和釋放鎖,使用tryLock()、tryLock(long time, TimeUnit unit)等方法進行可中斷的鎖操作。
* 并發工具類:使用CountDownLatch、CyclicBarrier、Semaphore、Exchanger等類創建并發工具類,使用await()、release()、exchange()等方法進行線程間的同步和通信操作。
## 1.6. 項目結構關系:
* 并發工具包中的類和方法可以與項目中的數據結構和算法相關,如使用ConcurrentHashMap存儲和管理緩存、使用ThreadPoolExecutor執行任務等。
* 并發工具包中的類和方法可以與項目中的任務調度和資源管理相關,如使用線程池管理網絡服務、使用Semaphore控制并發訪問資源等。
* 并發工具包中的類和方法可以與項目中的數據共享和協同處理相關,如使用AtomicInteger統計數據、使用CountDownLatch等待多個線程完成某項操作等。
* 并發工具包中的類和方法可以與項目中的資源和數據訪問控制相關,如使用鎖控制多線程訪問共享資源、使用CyclicBarrier協同多個線程進行數據處理等。
* 并發工具包中的類和方法可以與項目中的并發編程和通信相關,如使用Exchanger交換數據、使用Semaphore進行信號量控制等。
## 1.7. 實施關鍵流程:
* 并發容器:創建并發容器、使用線程安全的讀寫操作訪問并發容器。
* 線程池:創建線程池、提交任務、關閉線程池。
* 原子變量:創建原子變量、使用線程安全的讀寫操作訪問原子變量。
* 鎖:創建鎖、獲取鎖、釋放鎖。
* 并發工具類:創建并發工具類、使用并發工具類進行同步和通信操作。
## 1.8. 示例
一個經典的并發工具包應用示例是使用線程池和并發容器實現多線程爬蟲程序。
```
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;
public class MultiThreadCrawler {
private static final int MAX_THREADS = 10; // 最大線程數
private static final int MAX_PAGES = 1000; // 最大爬取頁面數
private static final String SEED_URL = "https://www.example.com"; // 起始URL
private ExecutorService threadPool; // 線程池
private ConcurrentHashMap<String, Integer> visitedUrls; //已訪問過的URL集合,使用ConcurrentHashMap實現線程安全的讀寫操作
private ConcurrentLinkedQueue<String> unvisitedUrls; // 待訪問的URL隊列,使用ConcurrentLinkedQueue實現線程安全的讀寫操作
private AtomicInteger pageCount; // 已訪問頁面計數器,使用AtomicInteger實現線程安全的原子操作
public MultiThreadCrawler() {
threadPool = Executors.newFixedThreadPool(MAX_THREADS);
visitedUrls = new ConcurrentHashMap<>();
unvisitedUrls = new ConcurrentLinkedQueue<>();
pageCount = new AtomicInteger(0);
}
public void start() {
unvisitedUrls.offer(SEED_URL); // 將起始URL加入待訪問隊列
while (pageCount.get() < MAX_PAGES && !unvisitedUrls.isEmpty()) {
String url = unvisitedUrls.poll(); // 取出待訪問隊列中的URL
if (visitedUrls.containsKey(url)) {
continue; // 已經訪問過該URL,跳過
}
visitedUrls.put(url, 1); // 將該URL添加到已訪問集合中
threadPool.submit(new PageFetcher(url, this)); // 提交頁面下載任務到線程池
}
threadPool.shutdown(); // 關閉線程池}
public void incrementPageCount() {
pageCount.incrementAndGet(); // 計數器原子自增
}
public static void main(String[] args) {
MultiThreadCrawler crawler = new MultiThreadCrawler();
crawler.start();
}
}
class PageFetcher implements Runnable {
private String url;
private MultiThreadCrawler crawler;
public PageFetcher(String url, MultiThreadCrawler crawler) {
this.url = url;
this.crawler = crawler;
}
@Override
public void run() {
// 下載頁面并處理數據
// ...
// 將新的URL添加到待訪問隊列
for (String newUrl : newUrls) {
crawler.unvisitedUrls.offer(newUrl); // 使用ConcurrentLinkedQueue的offer()方法實現線程安全的添加操作
}
crawler.incrementPageCount(); // 已訪問頁面計數器自增
}
}
```
在上述示例中,使用了線程池和并發容器來實現多線程爬蟲程序。
1. 線程池使用了`newFixedThreadPool()`方法創建固定大小的線程池,控制最大線程數不超過10個。
2. 并發容器使用了`ConcurrentHashMap`和`ConcurrentLinkedQueue`來實現線程安全的讀寫操作,分別用于存儲已訪問過的URL集合和待訪問的URL隊列。
3. 在`start()`方法中,首先將起始URL加入待訪問隊列,
4. 然后在循環中取出待訪問隊列中的URL,
5. 如果該URL已經訪問過,則跳過,
6. 否則將該URL添加到已訪問集合中,并提交頁面下載任務到線程池。
7. 下載頁面的任務在`PageFetcher`類中實現,
8. 下載完成后將新的URL添加到待訪問隊列中,并將已訪問頁面計數器自增。
通過使用線程池和并發容器,多線程爬蟲程序可以高效地爬取大量的數據,并支持高并發讀寫操作,提高了程序的可靠性和性能。
- 系統設計
- 需求分析
- 概要設計
- 詳細設計
- 邏輯模型設計
- 物理模型設計
- 產品設計
- 數據驅動產品設計
- 首頁
- 邏輯理解
- 微服務架構的關系數據庫優化
- Java基礎架構
- 編程范式
- 面向對象編程【模擬現實】
- 泛型編程【參數化】
- 函數式編程
- 響應式編程【異步流】
- 并發編程【多線程】
- 面向切面編程【代碼復用解耦】
- 聲明式編程【注解和配置】
- 函數響應式編程
- 語法基礎
- 包、接口、類、對象和切面案例代碼
- Springboot按以下步驟面向切面設計程序
- 關鍵詞
- 內部類、匿名類
- 數組、字符串、I/O
- 常用API
- 并發包
- XML
- Maven 包管理
- Pom.xml
- 技術框架
- SpringBoot
- 項目文件目錄
- Vue
- Vue項目文件目錄
- 遠程組件
- 敏捷開發前端應用
- Pinia Store
- Vite
- Composition API
- uniapp
- 本地方法JNI
- 腳本機制
- 編譯器API
- 注釋
- 源碼級注釋
- Javadoc
- 安全
- Swing和圖形化編程
- 國際化
- 精實或精益
- 精實軟件數據庫設計
- 精實的原理與方法
- 項目
- 零售軟件
- 擴展
- 1001_docker 示例
- 1002_Docker 常用命令
- 1003_微服務
- 1004_微服務數據模型范式
- 1005_數據模型
- 1006_springCloud
- AI 流程圖生成
- Wordpress_6
- Woocommerce_7
- WooCommerce常用的API和幫助函數
- WooCommerce的鉤子和過濾器
- REST API
- 數據庫API
- 模板系統
- 數據模型
- 1.Woo主題開發流程
- Filter
- Hook
- 可視編輯區域的函數工具
- 渲染字段函數
- 類庫和框架
- TDD 通過測試來驅動開發
- 編程范式對WordPress開發
- WordPress和WooCommerce的核心代碼類庫組成
- 數據庫修改
- 1.WP主題開發流程與時間規劃
- moho
- Note 1
- 基礎命令