参考答案:
同步(Synchronous)和异步(Asynchronous)是两种常见的并发执行方式,它们主要区分在任务执行过程中是否需要等待前一个任务完成后才能开始下一个任务。
定义:
同步是指在执行任务时,当前任务必须等待前一个任务完成才能开始执行下一个任务。在同步执行中,每个操作会在执行完成之后才会返回控制权给调用者。
特点:
应用场景:
例子:
1public void readFile() { 2 String content = readFromFile("file.txt"); // 同步读取文件 3 process(content); // 处理文件内容 4}
在上述例子中,readFromFile
是一个同步操作,程序会等到文件读取完成后,才会继续执行后面的 process(content)
。
定义:
异步是指任务的执行和任务的调用是分离的,调用者不需要等待任务完成就可以继续执行后续操作。当任务完成时,会通过回调、事件或其他方式通知调用者结果。
特点:
应用场景:
例子:
1public void fetchData() { 2 // 异步发送请求 3 sendAsyncRequest("http://server1.com", this::handleResponse); 4 sendAsyncRequest("http://server2.com", this::handleResponse); 5 sendAsyncRequest("http://server3.com", this::handleResponse); 6} 7 8public void handleResponse(String data) { 9 // 处理异步请求结果 10 System.out.println(data); 11}
在上述例子中,sendAsyncRequest
是异步操作,它会立即返回控制权,不需要等待请求完成,而 handleResponse
方法会在请求完成时被调用处理返回的结果。
特性 | 同步(Synchronous) | 异步(Asynchronous) |
---|---|---|
执行方式 | 当前任务执行时会阻塞,必须等待前一个任务完成才能执行下一个任务。 | 当前任务执行时不会阻塞,可以继续执行其他任务。 |
调用方式 | 执行完一个任务才能继续调用下一个任务。 | 任务会立即返回,调用者可以继续其他操作,任务完成后通知结果。 |
资源利用 | 阻塞调用,可能导致资源空闲时浪费时间。 | 可以更高效地利用资源,同时执行多个任务。 |
复杂度 | 实现简单。 | 需要使用回调、Promise、事件等机制,代码较复杂。 |
适用场景 | 简单、依赖顺序的任务,或者任务耗时较短。 | 需要并发处理多个任务,任务可能耗时较长。 |
例子 | 文件读取、数据库查询等。 | 网络请求、数据库批量操作等。 |
同步的适用场景:
异步的适用场景:
1public void syncMethod() { 2 // 同步操作 3 int result = someLongRunningTask(); 4 System.out.println("Result: " + result); 5}
Future
或 CompletableFuture
等机制。ExecutorService
、CompletableFuture
或事件驱动的框架来实现异步。1public void asyncMethod() { 2 CompletableFuture.supplyAsync(() -> someLongRunningTask()) 3 .thenAccept(result -> System.out.println("Result: " + result)); 4}
在上面的例子中,supplyAsync
会在后台线程异步执行 someLongRunningTask
,而主线程不会阻塞,可以继续执行其他任务,直到异步任务完成后通过 thenAccept
回调处理结果。
最近更新时间:2024-12-12