실생활에서든 프로그램에서든 크게 동기식과 비동기식의 두 가지 유형으로 나눌 수 있습니다.
동기화: 예를 들어 하이디라오를 먹으러 가면 냄비 바닥을 먼저 주문한 다음 접시를 주문하고 웨이터가 냄비 바닥을 가져온 다음 접시를 가져오고 마지막으로 접시를 먹을 수 있습니다. . 이 과정은 순서대로 이루어져야 합니다.
비동기 작업: 하이디라오 먹으러 가세요. 식사하는 사람이 많아요. 앞에 사람이 많아서 줄을 서서 기다려야 할 수도 있습니다. 그런데 도중에 화장실에 가고 싶다면 돌아올 때 다시 줄을 서야 합니다. 그래서 전화 시스템이 있습니다. 먼저 전화번호를 받기 위해 줄을 서서 마사지를 받고, 영화를 보고, 스파에 가고, 밀크티 한 잔을 사면 됩니다. 드디어 당신의 차례가 되었는데, 이때 줄을 서 있다는 알림을 받은 후 입장할 수 있습니다. 이 프로세스는 비동기식입니다. 2. SpringBoot + Async
나중에 SpringBoot에는 더 편리한 비동기 프레임워크 Async가 있다는 것을 기억했습니다
코드도 매우 간단합니다. 비동기 실행이 필요한 메서드에 @Async를 추가하고 SpringBoot 시작 클래스에 @EnableAsync를 추가하기만 하면 됩니다
@Async public void task() { // do something }
3. Step Pitfall Diary
편의를 위해 로컬 데모를 구축하고 코드를 직접 입력했습니다
@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그런데 메소드가 들어오는 곳에 중단점을 추가했더니 실제로는 메인 스레드가 차단된 걸 발견했어요!
Edit4. 해결
다양한 문제 해결, @Async가 적용되지 않음, 비동기 작업이 기본 스레드가 반환될 때까지 기다리며 효과적인 솔루션을 찾지 못했습니다.
한번 해보자는 마음으로 디버그 구성을 찾았습니다
Edit중단점은 jvm을 차단하거나 현재 스레드를 차단하도록 선택할 수 있습니다. 기본값은 jvm을 차단하는 것입니다.
스레드를 일시 중단으로 선택하면 메인 스레드가 더 이상 차단되지 않습니다
위 내용은 Java 비동기 작업 구현 및 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!