Java는 단일 쓰레드 언어이기 때문에 한 번에 하나의 작업만 수행할 수 있습니다. 그러나 Java 비동기 처리를 위한 여러 가지 메커니즘을 제공합니다.
예를 들어, setTimeout 함수를 사용하여 지정된 시간이 지난 후에 함수를 실행할 수 있습니다. 이 경우에는 작업이 백그라운드에서 처리되고, 타이머가 만료되면 이벤트 루프가 해당 함수를 호출합니다.
또한 웹 워커(Web Workers)를 사용하여 백그라운드 스레드에서 실행되는 별도의 Java파일을 만들어 실행할 수 있습니다. 이 경우에는 워커 스레드에서 실행되는 코드와 메인 스레드에서 실행되는 코드가 분리되어 있습니다.
여기에 예시 코드가 있습니다:
// setTimeout을 사용하여 비동기적으로 작업을 예약하는 예시 코드
console.log("start");
setTimeout(() => {
console.log("Hello from setTimeout");
}, 1000);
console.log("end");
위의 코드는 "start"를 출력한 후에 1초 후에 "Hello from setTimeout"을 출력합니다. setTimeout 함수가 호출되면 작업은 백그라운드에서 예약되고, 메인 스레드는 다음 코드를 실행합니다. 1초 후에 백그라운드에서 실행되던 작업이 완료되면 이벤트 루프가 해당 작업을 처리하고 콘솔에 "Hello from setTimeout"을 출력합니다.
start와 run의 차이점은 다음과 같습니다:
- start: 새로운 스레드를 시작하는 함수입니다. 이 함수를 호출하면 새로운 스레드가 만들어지고, 해당 스레드에서 지정된 함수가 실행됩니다.
- run: 현재 스레드에서 함수를 실행하는 함수입니다. 이 함수를 호출하면 현재 스레드에서 지정된 함수가 실행됩니다.
Java는 단일 쓰레드 언어이기 때문에, start 함수를 사용하여 새로운 스레드를 만들더라도 실제로 동시에 두 개의 작업이 수행되는 것은 아닙니다. 대신에, start 함수를 호출하여 새로운 스레드에서 실행할 작업을 예약합니다. 이러한 작업은 메인 스레드에서 실행되는 작업과 마찬가지로 이벤트 루프를 통해 처리됩니다.
Java에서 start와 run의 차이를 보여주는 예시 코드와 결과는 다음과 같습니다.
start 함수 예시 결과:
function longRunningOperation() {
// 긴 작업을 수행하는 코드
let result = 0;
for (let i = 0; i < 1000000000; i++) {
result += i;
}
return result;
}
console.log("Start");
// start 함수를 사용하여 새로운 스레드에서 longRunningOperation 함수를 실행합니다.
const thread = new Worker(URL.createObjectURL(new Blob([`(${longRunningOperation})()`])));
// 작업이 완료되면 결과를 출력합니다.
thread.onmessage = (event) => {
console.log(`Result: ${event.data}`);
};
console.log("End");
start 함수 예시 결과:
Start
Result: 499999999500000000
End
위의 코드는 start 함수를 사용하여 새로운 웹 워커 스레드에서 longRunningOperation 함수를 실행합니다. 스레드에서 작업을 수행하는 동안 메인 스레드는 다른 작업을 수행할 수 있으므로 "Start"와 "End"가 즉시 출력됩니다. 스레드에서 작업이 완료되면 onmessage 핸들러가 호출되어 결과를 출력합니다.
run 함수 예시 코드:
function longRunningOperation() {
// 긴 작업을 수행하는 코드
let result = 0;
for (let i = 0; i < 1000000000; i++) {
result += i;
}
return result;
}
console.log("Start");
// run 함수를 사용하여 현재 스레드에서 longRunningOperation 함수를 실행합니다.
const result = longRunningOperation();
console.log(`Result: ${result}`);
console.log("End");
run 함수 예시 결과:
Start
Result: 499999999500000000
End
위의 코드는 run 함수를 사용하여 현재 스레드에서 longRunningOperation 함수를 실행합니다. 작업이 완료될 때까지 메인 스레드는 다른 작업을 수행하지 않으므로 "Start", "Result", "End"가 순서대로 출력됩니다.
'JAVA-기초 > JAVA기본' 카테고리의 다른 글
[Java] 객체지향개념(OOP) 캡슐화와 정보은닉 (3) | 2023.09.03 |
---|---|
객체지향 프로그래밍 5가지 설계 원칙, SOLID- 단일책임의 원칙 (64) | 2023.08.12 |
자바(Java) 참조변수의 형변환(업캐스팅/다운캐스팅) (0) | 2023.02.09 |
자바(Java) 다형성(조상클래스,자손클래스) (0) | 2023.02.09 |
자바(Java) 인스턴스(객체), 객체 배열 (0) | 2023.02.08 |