─━ IT ━─

Java 中异步执行特定逻辑的四种方法

DKel 2024. 11. 11. 00:15
반응형

Java 提供了多种方法来实现异步执行特定逻辑,以下是一些常用的方法介绍。

Java 中的异步操作可以通过不同的工具实现。使用线程、ExecutorService、CompletableFuture 或者 Spring 的 @Async 注解来实现都很有效。选择合适的方法可以优化代码性能,提高响应速度,特别是在处理耗时任务时。下面是四种常用的异步执行方法:

线程(Thread)

public class AsyncExample {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            // 비동기로 실행할 로직
            System.out.println("비동기 작업 시작");
            // 시간 소모 작업 시뮬레이션
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("비동기 작업 완료");
        });

        thread.start(); // 스레드 시작
        System.out.println("메인 스레드 작업 계속 진행");
    }
}


通过 Java 内置的 Thread 类可以简单实现异步执行。创建一个新的线程,将需要异步执行的逻辑放入其中,启动线程后主线程可以继续执行其他任务。

ExecutorService

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class AsyncExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(2); // 스레드 풀 생성

        executor.submit(() -> {
            // 비동기로 실행할 로직
            System.out.println("비동기 작업 시작");
            // 시간 소모 작업 시뮬레이션
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("비동기 작업 완료");
        });

        executor.shutdown(); // ExecutorService 종료
        System.out.println("메인 스레드 작업 계속 진행");
    }
}


使用 ExecutorService 可以通过线程池管理异步任务。这样不仅能创建线程,还能复用线程池,节省系统资源并提高执行效率。ExecutorService 提供了 submit 方法,用于提交异步任务并在必要时关闭服务。

CompletableFuture

import java.util.concurrent.CompletableFuture;

public class AsyncExample {
    public static void main(String[] args) {
        CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
            // 비동기로 실행할 로직
            System.out.println("비동기 작업 시작");
            // 시간 소모 작업 시뮬레이션
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("비동기 작업 완료");
        });

        future.thenRun(() -> System.out.println("비동기 작업 후 후속 작업 실행"));
        System.out.println("메인 스레드 작업 계속 진행");
    }
}


Java 8 及以上版本提供的 CompletableFuture 是一个强大的异步编程工具。它允许轻松实现异步操作,并通过 thenRun 等方法为后续操作设置逻辑。CompletableFuture.runAsync 可以执行无返回值的异步任务,future.thenRun 可以在异步任务完成后执行后续操作。

Spring 的 @Async 注解

import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Service;

@EnableAsync
@Service
public class AsyncService {

    @Async
    public void asyncMethod() {
        System.out.println("비동기 작업 시작");
        // 시간 소모 작업 시뮬레이션
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("비동기 작업 완료");
    }
}

// 메인 클래스에서 호출
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Application {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        AsyncService asyncService = context.getBean(AsyncService.class);

        asyncService.asyncMethod(); // 비동기 메서드 호출
        System.out.println("메인 스레드 작업 계속 진행");
    }
}


在 Spring 框架中,可以使用 @Async 注解实现异步方法。将 @EnableAsync 和 @Async 添加到类和方法上,Spring 就会自动将该方法作为异步任务执行。此方法适用于 Spring 环境中,代码更为简洁。

반응형