반응형
한번쯤은 동기, 비동기라는 말을 들어봤을 것이다.
동기(sync)는 한가지 작업이 끝난 후 다른 작업을 시작하는것이고
비동기(async)는 다른 작업과 상관 없이 병렬처리를 하는것이다.
두 방식의 가장 큰 차이점은 동기는 선행작업이 존재하기 때문에 선행 작업의 return 값이 관련이 있다고 볼 수 있고,
비동기(async)는 서로의 return 값에 관련이 없다고 볼 수 있다.
1. 동기(sync)
package ex01.동기.비동기;
public class Ex_sync_async_No_Thread {
public static void main(String[] args) {
// Thread를 사용하지 않는 코드
///////////////////////////////////////////////////////////////////////////////////////////////////////
System.out.println("작업1 시작");
try{
Thread.sleep(1500);
System.out.println("작업1 : 1000설정");
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("작업1 종료");
///////////////////////////////////////////////////////////////////////////////////////////////////////
System.out.println("작업2 시작");
try{
Thread.sleep(500);
System.out.println("작업2 : 1500설정");
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("작업2 종료");
}
}
위 코드를 보자 단순 Exception 처리만 하고 있으며 Thread를 사용하지 않는다.
더보기
비동기 처리 시작
비동기처리1 : 1000설정
비동기처리1 종료
비동기처리2 시작
비동기처리2 : 1500설정
비동기처리2 종료
이 코드의 결과를 보면 1.5초 0.5초로 두 내용의 시간 다른고 단순히 출력만 진행하는 내용이다. 이 코드를보면 누가봐도 작업1이 끝날떄까지 기다린 후 작업2를 진행하는것이 효율적이지 않다.
2. 비동기(async)
package ex01.동기.비동기;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Ex_sync_async_Yes_Thread {
public static void main(String[] args) {
// Thread를 사용하는 코드
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.submit(() -> {
log("작업1 시작");
try {
Thread.sleep(1500);
}catch(Exception e) {
e.printStackTrace();
}
log("작업1 종료");
});
log("작업2 시작");
try {
Thread.sleep(500);
}catch(Exception e) {
e.printStackTrace();
}
log("작업2 종료");
executorService.shutdown();
}
private static void log(String content) {
System.out.println(Thread.currentThread().getName() + "> " + content);
}
}
Thread처리를 사용한 코드를 보자 이 코드의 결과는
더보기
main> 작업2 시작
pool-1-thread-1> 작업1 시작
main> 작업2 종료
pool-1-thread-1> 작업1 종료
main에서 실행되는 처리는 작업2이고 다른 Thread에서 작업1이 진행되는것을 볼 수 있다.
이처럼 다른 Thread를 사용하여 서로 연관성 없는, 시간이 다른 작업들을 병렬처리 할 수있다.
반응형