본문 바로가기
JAVA/JAVA복습(멘토씨리즈 자바)

[JAVA복습] 18. 스레드

by ssunooo 2024. 7. 29.

 

 

1. 핵심 정리

 

프로세스란?

프로세스란 프로그램이 동작하여 메모리에 올려진 상태를 말하며 실행 중인 프로그램을 의미

 

스레드란?

스레드는 프로세스 내에서 독립적으로 실해오디는 작업단위를 의미

프로세스 내의 주소 공간이나 자원들과 같은 스레드끼리 공유하면서 실행

 

멀티 스레드

스레드는 임의의 클래스에 Thread 클래스를 상속하거나 Runnable 인터페이스를 상속하여 구현할 수 있는데,

하나의 프로세스 안에서 스레드를 여러 개 선언하여 멀티 스레드를 사용 가능

 

동기화 메서드

멀티 스레드를 구현할 경우, 스레드의 동작 순서와 자원 공유를 위해 스레드 동기화를 통해 기능을 구현

스레드 객체 내부의 동기화 메서드를 실행하면 다른 스레드가 동기화 메서드를 실행하지 못하도록

스레드끼리의 자원 공유를 제어

 

스레드 상태

스레드를 생성하고 동작을 시작하면 다양한 상태를 가짐

스레드의 상태는 자동으로 변경될 수 있고 개발자에 의해 임의로 변경 가능

상태 상수 설명
생성 NEW 스레드 객체가 생성되었지만 아직 start() 메서드가 호출되지 않은 상태
대기 RUNNABLE 실행 대기 또는 실행 상태로 언제든지 갈 수 있는 상태
일시정지 WATING 다른 스레드가 종료될 때까지 대기하는 상태
TIMED_WATING 주어진 시간 동안 대기하는 상태
BLOCKED 락이 풀릴 때까지 대기하는 상태
종료 TERMINATED 수행을 종료한 상태

 

sleep 메서드

스레드의 상태를 잠시 정지하고 싶다면 sleep메서드를 사용해 원하는 시간(초 단위)만큼 정지 가능

 

wait(), notify() 메서드

wait(), notify() 메서드를 사용하면 원하는 시점에 스레드를 잠시 종료하거나 다시 시작 가능

 


 

2. 응용 문제

 

Q1. 다음 중 스레드의 설명으로 틀린 것을 고르세요.

  1. 스레드는 프로세스 내 작업 단위를 말합니다.
  2. 하나의 프로세스 안에 여러 개의 스레드가 존재할 수 있습니다.
  3. 스레드가 여러 개일 경우 서로 간의 간섭이 가능합니다.
  4. 스레드는 Thread 클래스 또는 Runnable 인터페이스를 상속하여 구현합니다.

A1. 4

 


 

Q2. 다음 중 스레드 일시정지 상태에 대한 설명 중 틀린 것을 고르세요.

  1. 일시정지 상태는 BLOCKED, WAITING, TIMED_WAITING이 있습니다.
  2. 스레드가 동기화 메서드를 실행할 때 다른 스레드가 동기화 메서드를 호출하게 되면 BLOCKED 일시정지
    상태가 됩니다.
  3. 스레드가 여러 개일 경우 서로 간의 간섭이 가능합니다.
  4. 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