https://www.youtube.com/watch?v=IdpkfygWIMk
우테코 발표내용을 보고 정리한 내용입니다.
Block 과 Non-Block 핵심은 제어권에 있습니다.
아래와같은 예제 코드가있습니다.
function 함수1() {
functionA();
functionB();
functionC();
}
function functionA() {
/*~~~~~~ 로직 ~~~~~~*/
return something;
}
function functionB() {
}
function functionC() {
}
Synchronous = Syn(함께) + Chrono(시간)
어떤 대상들의 시간이 일치하는지, 시간대를 가져가서 같은 결과(데이터)를 가지고있는지를 확인합니다.
이때 어떤 대상인지? 어떤 시간대인지?
위에서 사용했던 함수를 다시 봅시다.
function 함수1() {
functionA();
functionB();
functionC();
}
function functionA() {
/*~~~~~~ 로직 ~~~~~~*/
return something;
}
function functionB() {
}
function functionC() {
}
제어권과 결과값을 반환하는게 같은것을 Sync라고 합니다.
순서 : 함수1() - functionA(제어권&결과값 반환) - functionB(제어권&결과값 반환) - functionC(제어권&결과값 반환) - 종료
이렇게 순서가 정해진것, 이것도 동기화에 일종입니다.
자바에서 멀티스레드 환경에서 쓰레드에 종료시간을 맞춰주는 메서드 'Thread.join()'에 경우에도, 동기화에 일종입니다.
Thread thread = new Thread(new Runnable() {
public void run() {
// 쓰레드 동작 내용
}
});
// 쓰레드 시작
thread.start();
// 쓰레드 종료를 기다림
try {
thread.join();
} catch (InterruptedException e) {
// 예외 처리
}
위의 코드에서 thread.join()은 호출한 쓰레드가 thread 쓰레드가 종료될 때까지 기다립니다.
join() 메서드는 InterruptedException을 던질 수 있으므로 해당 예외를 처리해야 합니다.
이렇게 join() 메서드를 사용하면 다른 쓰레드들이 해당 쓰레드의 종료를 기다릴 수 있습니다.
Sync와 반대로 종료시간대가 일치하지 않거나, 결과값도 안됐는데 제어권을 반환한다거나(Non-block)
문득 이렇게 설명을 들으면
Block == Sync, Non-Block == Async처럼 들리겠지만
이부분은 보는 관점이 다릅니다.
Block, Non-Block 는 제어권에 관련된 내용입니다.
Sync, Async는 제어권을 반환하는 시간과 타이밍에 대한 내용입니다.
이처럼 묘한 연관이되어있으며, 실제 개발시에는 이런 묘한 연관관계를 잘 이용합니다.
// 비동기 작업 실행
Future<Integer> future = executor.submit(callable);
System.out.println("작업 시작");
// 작업 완료를 기다림
while (!future.isDone()) { // 엄청 오래걸리는 작업 시작
System.out.println("작업 진행 중...");
Thread.sleep(500); // 잠시 대기
}
// 작업 완료 후 결과 획득
int result = future.get();
System.out.println("작업 결과: " + result);
위처럼 예제 소스코드가 있을때
1. future.isDone()에 함수를 호출하여 작업이 끝났는지 안끝났는지 확인합니다.
2. 작업이 끝나지 않았을경우 while문 안에있는 내용이 실행됩니다.
3. while문 내용이 끝난 후 future.isDone()을 호출하여 작업이 끝났는지 안끝났는지 확인합니다.
4. 끝나지 않았을경우 다시 2번과 3번을 반복합니다.
5. 언제까지? future.isDone()함수에 작업이 끝날때 까지...
위와 같은 소스코드가 있을경우 이건 동기일까요? 비동기일까요?
Future에서 비동기/논블로킹으로 작업이 실행되어
while문은 동기로 함수가 끝났는지 않끝났는지 확인합니다.
(끝나지 않았어도, 끝나지 않았다는 상태값을 리턴하기에 동기입니다.)
이렇게 작업이 완료될때까지 기다린 후 future.get();으로 결과값을 받을때까지 기다립니다.
이때는 동기/블러킹으로 값을 기다립니다.
이렇게 4가지 상황 (Block, Non-Block, Sync, Async)을 확실하게 나눌수가 없습니다.
이런 각박한 코딩 세상속 모든것을 나누려고 하지말구, 개념만 이해해보져.
블락과 논블락은 제어권을 누가가지고 언제 반환하는지, 제어할 수 없는 대상을 어떻게 처리할지에 대한 내용
싱크와 어싱크는 제어권을 반환하는 시간, 결과값을 반환하는 시간, 다음 함수가 시작하는 시간에 그게 일치가 되는지에 대한 내용