java 비동기 프로그램을 만들어보자. 단 스레드를 하나만 사용하고 CompletableFuture 를사용해 구현하자.
그전에 필요한 내용을 공부하자. 동기vs비동기 , 블로킹,논블로킹, 멀티프로그래밍, 비동기 프로그래밍 용어 정리를 확실히하자.
비동기 프로그래밍과 멀티 스레딩 프로그래밍 뭐가 다른가?? 일단은 동기와 비동기를 구분 짓자.
동시성(Concurrency) vs 병렬성(Parallelism)
동기(synchronous) vs 비동기(asynchronous)

동기 프로그래밍은 코드가 작성한 순서대로 실행된다. 호출되는 함수의 작업 완료 여부를 신경쓴다.
비동기 프로그래밍
call back 함수이다. 함수가 진행될 때 결과 값이나 진행하다 다시 돌아가야할 때 이것을 알게 하는 함수가블로킹은 A 함수가 B 함수를 호출하면, 제어권을 A가 호출한 B 함수에 넘겨준다. 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이
끝날 때까지 기다렸다가 자신의 작업을 시작하는 것
논블로킹은 A함수가 B함수를 호출해도 제어권은 그대로 자신이 가지고 있는다. 다른 주체의 작업에 관련없이 자신의 작업을 하는 것
결론 적으로 동기,비동기와 같이 생각하자 ex) 동기 + 블로킹, 비동기+ 논 블로킹 등
비동기 프로그래밍(asynchronou programming)은 여러 작업을 하는 하나의 방법론 적인것이다. 멀티 프로그래밍은 이 비동기 프로그램의 한 종류이다. 비동기 프로그래밍은 결국 단일,멑티 스레드 모두에서 적용 할 수 있다.
비동기 프로그래밍의 방법
스레드를 여러개 만든다 -> 멀티 스레드
non -block i/o 논 블로킹 i/0라고 봐도무방 싱글 스레드여도 비동기 프로그래밍이 가능.
결론 적으로 두가지 방법을 통해 좋은 성능을 내는 비동기 프로그래밍을 할 수 있다.

메세지 큐를 이용해 동기 프로그램에서 생길 수 있는 오류를 예방 할 수있다.
참고자료:https://jayhyun-hwang.github.io/2021/09/02/The-Difference-Between-Asynchronous-And-Multi-Threading/
여러 프로세스/스레드가 동시에 같은 데이터를 조작할때 타이밍,순서에 따라 결과가 달라진다. 이것을 경쟁조건(Race condition) 이라한다.
실행해도 공유 데이터의 일관성을 유지하는것 이것을 동기화(Synchronizaion)라고한다.
공유데이터의 일관성을 보장하기 위해 하나의 프로세스/스레드가 진입해서 실행 가능한 영역을 임계영역(Critical section)이라 부른다.
임계영역 문제 해결책
스레드 세이프(Thread Safe)
동기화(Synchronization) 기법
교착 상태 Dead-Lock
참고자료: https://sangwoo0727.github.io/java/JAVA-36_timertask/
CompletableFuture
https://codechacha.com/en/java-completable-future/
https://www.youtube.com/watch?v=PzxV-bmLSFY
자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행된다. 쓰레드가 없다면 자바 애플리케이션 실행이 불가능하다.
스레드는 한번에 한가지 일밖에 하지못해 동시 처리가 필요하면 쓰레드를 추가로 생성해야 한다.-> 멀티 스레드
하지만 요청시마다 스레드스를 생산할 경우 비용이 너무 비싸다. 스레드의 교체는 컨텍스트 스위칭 비용이 발생한다. 그렇기 때문에 개발자는 스레드 풀이라는 스레드를 보관하는 상자를 만들어 관리해야한다.
쓰레드가 필요하면, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용한다. 사용을 종료하면 쓰레드 풀에 해당 쓰레드를 반납한다.
하지만 스레드 관리는 매우 어렵고 WAS가 이것을 관리해준다. 즉 개발자는 멀티 스레드 환경을 생각할 필요가없다. 스프링을 사용하면서 멀티 스레드의 문제에서 다소 편안한 것은 WAS가 싱글톤 객체(서블릿, 스프링 빈) 을 사용하면서 처리해 주기 때문이고, 개발자는 만약 성능을 튜닝할시 스레드풀의 MAX숫자를 설정해 줄 수있다.