Java同步转换为异步
在Java中,同步是指按照预定的顺序执行多个线程的代码块。异步是指多个线程不按特定顺序可以并发执行。
使用同步代码块synchronized
多线程或异步框架可以实现关键字修改和异步代码。
将Java代码从同步到异步有两种常用的方法。
1. 实现多线程异步异步执行可以通过创建多个线程来实现。Java提供了继承Thread类、实现Runnable接口、使用线程池等多种创建线程的方法。
使用继承Thread类的方法public class MyThread extends Thread { @Override public void run() { // 异步执行代码 }}public class Main { public static void main(String[] args) { Thread thread = new MyThread(); thread.start(); // 启动异步线程 // 继续执行其它代码 }}
实现Runnnable接口的方法public class MyRunnable implements Runnable { @Override public void run() { // 异步执行代码 }}public class Main { public static void main(String[] args) { Runnable runnable = new MyRunnable(); Thread thread = new Thread(runnable); thread.start(); // 启动异步线程 // 继续执行其他代码 }}
使用线程池import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class MyRunnable implements Runnable { @Override public void run() { // 异步执行代码 }}public class Main { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(10); // 创建线程池 executor.execute(new MyRunnable()); // 提交异步任务 executor.shutdown(); // 关闭线程池 // 继续执行其他代码 }}
在上述代码中,我们可以创建多个线程来实现异步执行,每个线程可以独立执行异步代码。
2. 使用异步框架实现异步框架除了使用多线程外,还可以使用异步框架来实现异步操作。常用的Java异步框架包括CompletableFuture、RxJava等。
使用CompletablefureCompletableFuture是Java8引进的一种异步编程工具,可以轻松实现异步操作。
import java.util.concurrent.CompletableFuture;public class Main { public static void main(String[] args) { CompletableFuture<Void> future = CompletableFuture.runAsync(() -> { // 异步执行代码 }); // 继续执行其他代码 future.join(); // 等待异步任务完成 }}
在上述代码中,我们使用CompletablefurerunAsync
通过提交异步任务的方法join
方法等待任务完成。
RxJava是一种基于观察者模式的异步编程框架,可以简化异步操作的编写。
import io.reactivex.rxjava3.core.Observable;import io.reactivex.rxjava3.schedulers.Schedulers;public class Main { public static void main(String[] args) { Observable.fromCallable(() -> { // 异步执行代码 return null; }) .subscribeOn(Schedulers.io()) // 执行IO线程 .observeOn(Schedulers.single()) // 单线程处理结果 .subscribe(result -> { // 处理异步任务的结果 }); // 继续执行其他代码 }}
在上述代码中,我们使用RxJavafromCallable
该方法将异步任务包装成Observable对象,然后通过subscribeOn
和observeOn
执行线程和结果处理线程指定异步任务。
以下是同步和异步执行的对比表:
Future
对象或回调处理结果线程阻塞主线程不阻塞主线程
