>  기사  >  Java  >  Java 비동기 작업 구현 및 분석

Java 비동기 작업 구현 및 분석

PHPz
PHPz앞으로
2023-04-22 20:49:061534검색

1. 비동기 작업이란

실생활에서든 프로그램에서든 크게 동기식과 비동기식의 두 가지 유형으로 나눌 수 있습니다.

동기화: 예를 들어 하이디라오를 먹으러 가면 냄비 바닥을 먼저 주문한 다음 접시를 주문하고 웨이터가 냄비 바닥을 가져온 다음 접시를 가져오고 마지막으로 접시를 먹을 수 있습니다. . 이 과정은 순서대로 이루어져야 합니다.

비동기 작업: 하이디라오 먹으러 가세요. 식사하는 사람이 많아요. 앞에 사람이 많아서 줄을 서서 기다려야 할 수도 있습니다. 그런데 도중에 화장실에 가고 싶다면 돌아올 때 다시 줄을 서야 합니다. 그래서 전화 시스템이 있습니다. 먼저 전화번호를 받기 위해 줄을 서서 마사지를 받고, 영화를 보고, 스파에 가고, 밀크티 한 잔을 사면 됩니다. 드디어 당신의 차례가 되었는데, 이때 줄을 서 있다는 알림을 받은 후 입장할 수 있습니다. 이 프로세스는 비동기식입니다. 2. SpringBoot + Async

처음에는 스레드 풀을 열고 작업을 스레드 풀에 던져 완료하려고 생각했습니다.

나중에 SpringBoot에는 더 편리한 비동기 프레임워크 Async가 있다는 것을 기억했습니다

코드도 매우 간단합니다. 비동기 실행이 필요한 메서드에 @Async를 추가하고 SpringBoot 시작 클래스에 @EnableAsync를 추가하기만 하면 됩니다

    @Async
    public void task() {
        // do something
    }

3. Step Pitfall Diary

코드의 양이 작아도 코드 양이 줄어든다고 해서 Pitfall은 줄어들지 않습니다.

편의를 위해 로컬 데모를 구축하고 코드를 직접 입력했습니다

@RestController
public class AsyncController {
    @Autowired
    private AsyncService asyncService;

    @GetMapping("/v1/say")
    public String sayV1() {
        asyncService.sayV1();
        return "success1";
    }

    @GetMapping("/v2/say")
    public String sayV2() {
        asyncService.sayV2();
        return "success2";
    }
}
@Service
public class AsyncService {
    public void sayV1() {
        try {
            Thread.sleep(3000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("hello world");
    }

    @Async
    public void sayV2() {
        try {
            Thread.sleep(3000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("hello world");
    }
}

동기 실행용과 비동기 실행용 /v1/say 및 /v2/say 두 가지 인터페이스를 제공하는 매우 간단한 데모입니다. 3초 동안 시간이 많이 걸리는 작업을 시뮬레이션합니다.

정상적으로 시작합니다. 동기적으로 실행하면 3초 동안 기다렸다가 비동기적으로 실행하면 즉시 반환됩니다. 중단점 이후에 추가하면 문제가 발생했습니다.

먼저 hello world를 인쇄하는 라인에 중단점을 추가했습니다. 인쇄 전에 차단된다는 점을 제외하면 효과는 원본과 동일하지만 메인 스레드의 반환에는 영향을 미치지 않습니다.

Edit

Java 비동기 작업 구현 및 분석그런데 메소드가 들어오는 곳에 중단점을 추가했더니 실제로는 메인 스레드가 차단된 걸 발견했어요!

Edit

Java 비동기 작업 구현 및 분석4. 해결

다양한 문제 해결, @Async가 적용되지 않음, 비동기 작업이 기본 스레드가 반환될 때까지 기다리며 효과적인 솔루션을 찾지 못했습니다.

나중에 동료가 디버그 기능에 의해 차단된 스레드일 수 있다고 상기시켜 주었습니다.

한번 해보자는 마음으로 디버그 구성을 찾았습니다

Edit

Java 비동기 작업 구현 및 분석중단점은 jvm을 차단하거나 현재 스레드를 차단하도록 선택할 수 있습니다. 기본값은 jvm을 차단하는 것입니다.

스레드를 일시 중단으로 선택하면 메인 스레드가 더 이상 차단되지 않습니다

위 내용은 Java 비동기 작업 구현 및 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제