请求提供Sequential/Parallel、Synchronous/Asynchronous四种并发任务示例及多线程归类说明
并发任务四种组合示例及疑问解答
先明确两个核心维度:
- Sequential/Parallel:任务的执行排列方式(按顺序挨个执行/多个任务同时运行)
- Synchronous/Asynchronous:任务是否阻塞调用者(必须等任务完成才继续/发起任务后直接执行后续逻辑,任务完成后通知结果)
一、四种组合的具体示例
1. 顺序同步(Sequential Synchronous)
特征:任务按顺序执行,每个任务运行时会卡住当前执行流,必须等它完全结束才启动下一个任务。
示例(Python):
def read_file1(): print("开始读取文件1(同步)") # 同步读文件,会卡住程序直到读取完成 with open("file1.txt", "r") as f: content = f.read() print("文件1读取完成") def read_file2(): print("开始读取文件2(同步)") with open("file2.txt", "r") as f: content = f.read() print("文件2读取完成") # 先执行read_file1,完成后才会执行read_file2 read_file1() read_file2()
2. 顺序异步(Sequential Asynchronous)
特征:任务按顺序发起,但每个任务发起后不会阻塞执行流,不过要等前一个异步任务完成,才会发起下一个任务。
示例(Node.js):
async function fetchUser(userId) { // 异步请求,发起后不会阻塞事件循环 const response = await fetch(`/api/users/${userId}`); return response.json(); } async function runTasks() { // 等待第一个请求返回后,再发起第二个请求 const user1 = await fetchUser(1); console.log("用户1数据获取完成:", user1); const user2 = await fetchUser(2); console.log("用户2数据获取完成:", user2); } runTasks();
3. 并行同步(Parallel Synchronous)
特征:多个任务在不同执行单元(线程/进程)里同时运行,每个任务本身是同步阻塞的,但整体是并行执行状态。
示例(Java):
public class ParallelSyncDemo { public static void main(String[] args) throws InterruptedException { Thread task1 = new Thread(() -> { System.out.println("任务1开始(同步计算)"); long sum = 0; // 同步计算,会卡住当前线程直到完成 for (long i = 0; i < 100000000L; i++) { sum += i; } System.out.println("任务1完成,结果:" + sum); }); Thread task2 = new Thread(() -> { System.out.println("任务2开始(同步计算)"); long product = 1; for (long i = 1; i < 20L; i++) { product *= i; } System.out.println("任务2完成,结果:" + product); }); // 同时启动两个线程,并行执行同步任务 task1.start(); task2.start(); task1.join(); task2.join(); } }
4. 并行异步(Parallel Asynchronous)
特征:多个异步任务同时发起,无需等待前一个任务完成,各自独立执行,完成后统一返回结果。
示例(Node.js):
async function fetchUser(userId) { const response = await fetch(`/api/users/${userId}`); return response.json(); } async function runTasks() { // 同时发起两个异步请求,并行执行 const userPromise1 = fetchUser(1); const userPromise2 = fetchUser(2); // 等待两个请求都完成后获取结果 const [user1, user2] = await Promise.all([userPromise1, userPromise2]); console.log("用户1数据:", user1); console.log("用户2数据:", user2); } runTasks();
二、Node.js async/await的归类判断
你的判断是完全正确的。
async/await是Promise的语法糖,默认使用await会强制异步任务串行执行:必须等当前await的Promise完成,才会执行下一行代码。这种写法下,任务是异步的(不会阻塞Node.js的事件循环),但执行顺序是顺序的,属于顺序异步。
当然,如果搭配Promise.all这类API,也能用async/await实现并行异步,但标准的单await串行写法确实属于顺序异步。
三、多线程的归类
多线程是实现并行执行的载体,具体归类要看线程内执行的任务类型:
- 如果线程内运行的是同步阻塞任务(比如计算密集型操作、同步IO),那就是并行同步(比如上面的Java多线程示例);
- 如果线程内运行的是异步非阻塞任务(比如某些语言里线程配合异步IO框架),那就是并行异步。
日常开发中,多线程最常见的场景是并行同步——用来解决单线程被同步任务阻塞的问题,让多个同步任务在不同线程里同时执行,提升整体执行效率。
内容的提问来源于stack exchange,提问作者user22288295
相关产品推荐
相关产品推荐

