1. 핵심 정리
프로세스란?
프로세스란 프로그램이 동작하여 메모리에 올려진 상태를 말하며 실행 중인 프로그램을 의미
스레드란?
스레드는 프로세스 내에서 독립적으로 실해오디는 작업단위를 의미
프로세스 내의 주소 공간이나 자원들과 같은 스레드끼리 공유하면서 실행
멀티 스레드
스레드는 임의의 클래스에 Thread 클래스를 상속하거나 Runnable 인터페이스를 상속하여 구현할 수 있는데,
하나의 프로세스 안에서 스레드를 여러 개 선언하여 멀티 스레드를 사용 가능
동기화 메서드
멀티 스레드를 구현할 경우, 스레드의 동작 순서와 자원 공유를 위해 스레드 동기화를 통해 기능을 구현
스레드 객체 내부의 동기화 메서드를 실행하면 다른 스레드가 동기화 메서드를 실행하지 못하도록
스레드끼리의 자원 공유를 제어
스레드 상태
스레드를 생성하고 동작을 시작하면 다양한 상태를 가짐
스레드의 상태는 자동으로 변경될 수 있고 개발자에 의해 임의로 변경 가능
| 상태 | 상수 | 설명 |
| 생성 | NEW | 스레드 객체가 생성되었지만 아직 start() 메서드가 호출되지 않은 상태 |
| 대기 | RUNNABLE | 실행 대기 또는 실행 상태로 언제든지 갈 수 있는 상태 |
| 일시정지 | WATING | 다른 스레드가 종료될 때까지 대기하는 상태 |
| TIMED_WATING | 주어진 시간 동안 대기하는 상태 | |
| BLOCKED | 락이 풀릴 때까지 대기하는 상태 | |
| 종료 | TERMINATED | 수행을 종료한 상태 |
sleep 메서드
스레드의 상태를 잠시 정지하고 싶다면 sleep메서드를 사용해 원하는 시간(초 단위)만큼 정지 가능
wait(), notify() 메서드
wait(), notify() 메서드를 사용하면 원하는 시점에 스레드를 잠시 종료하거나 다시 시작 가능
2. 응용 문제
Q1. 다음 중 스레드의 설명으로 틀린 것을 고르세요.
- 스레드는 프로세스 내 작업 단위를 말합니다.
- 하나의 프로세스 안에 여러 개의 스레드가 존재할 수 있습니다.
- 스레드가 여러 개일 경우 서로 간의 간섭이 가능합니다.
- 스레드는 Thread 클래스 또는 Runnable 인터페이스를 상속하여 구현합니다.
A1. 4
Q2. 다음 중 스레드 일시정지 상태에 대한 설명 중 틀린 것을 고르세요.
- 일시정지 상태는 BLOCKED, WAITING, TIMED_WAITING이 있습니다.
- 스레드가 동기화 메서드를 실행할 때 다른 스레드가 동기화 메서드를 호출하게 되면 BLOCKED 일시정지
상태가 됩니다. - 스레드가 여러 개일 경우 서로 간의 간섭이 가능합니다.
- yield 메서드를 호출하면 TIMED_WAITING 일시정지 상태가 됩니다.
A2. 4
Q3. 다음 빈칸( ■ ■ ■ ■ )에 알맞은 코드를 작성하여 완성해 보세요.
package section18;
class MyThread extends ■■■■■■■{
@Override
public void run() {
for(int i=1;i<=5;i++) {
System.out.println(i+"초");
}
}
public static void main(String[] args) {
MyThread m=new MyThread();
m.start();
}
}
A3. Thread
Q4. 다음 코드의 빈칸을 완성하여 스레드를 동작시키는 코드를 작성해 보세요.
package section18;
class MyRunnable implements Runnable {
@Override
public void run() {
for(int i=1;i<=5;i++) {
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println(i+"초");
}
}
}
A4.
package section18;
class MyRunnable implements Runnable {
@Override
public void run() {
for(int i=1;i<=5;i++) {
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println(i+"초");
}
}
public class RunnableExample {
public static void main(String[] args) {
// MyRunnable 인스턴스를 생성
MyRunnable myRunnable = new MyRunnable();
// MyRunnable 인스턴스를 Thread 객체에 전달
Thread thread = new Thread(myRunnable);
// 스레드 시작
thread.start();
// main 스레드의 작업
try {
thread.join(); // 메인 스레드가 myRunnable 스레드의 종료를 기다림
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("스레드 실행 완료");
}
}
}
2024.07.29
'JAVA > JAVA복습(멘토씨리즈 자바)' 카테고리의 다른 글
| [JAVA복습] 19. 파일 입출력 (0) | 2024.07.30 |
|---|---|
| [JAVA복습] 17. 람다식 (0) | 2024.07.29 |
| [JAVA복습] 16. 컬렉션 프레임워크 (0) | 2024.07.27 |
| [JAVA복습] 15. 기본 API 클래스 (0) | 2024.07.27 |
| [JAVA복습] 14. 예외처리 (0) | 2024.07.25 |