[section 1] Java 심화(4) - 스레드 Thread

수경·2022년 11월 15일
0

코드스테이츠

목록 보기
22/57

프로세스와 스레드

✔️ 프로세스: 실행 중인 애플리케이션
✔️ 스레드: 하나의 코드 실행 흐름


메인 스레드

메인 메소드를 실행시키는 스레드

  • main 메소드의 처음부터 끝까지 순차적으로 실행
  • 코드의 끝이나 return문을 만나면 실행 종료
  • 싱글 스레드로 작성된 코드 ➡️ 메인 스레드만 가지는 싱글 프로세스

멀티 스레드

여러 스레드가 동시에 작업을 수행


스레드의 생성과 실행

첫 번째 방법

Runnable 인터페이스를 구현한 객체에서 run()을 구현하여 생성하고 실행하는 방법

class First implements Runnable {
	public void run() {
    	// 스레드가 수행할 내용
    }
}
public class ThreadExample {
	public static void main(String[] args) {
        Thread thread = new Thread(new First());
        // 스레드 실행 -> run() 실행
        thread.start();
	}
}

두 번째 방법

Thread 클래스를 상속받은 하위 클래스에서 run()을 구현하여 스레드를 생성하고 실행하는 방법

class Second extends Thread {
	@Override
	public void run() {
    	// 스레드가 수행할 내용
    }
}
class ThreadExample {
	public static void main(String args[]) {
		Second thread = new Second();
        // 스레드 실행 -> run() 실행
        tread.start();
	}	
}

스레드의 동기화

멀티 스레드 프로세스의 경우, 같은 데이터에 동시에 공유하는 경우 발생
➡️ 데이터의 오류❗️
➡️ 한 스레드가 사용할 때 접근하지 못하도록 임계영역 필요

✔️ 임계영역 Critical Section

오직 하나의 스레드만 코드를 실행할 수 있는 코드 영역
synchronized 키워드로 임계 영역을 지정

✔️ 락 Lock

임계 영역을 포함하고 있는 객체에 접근할 수 있는 권한

임의의 스레드 A가 임계 영역 코드를 실행할 경우 A는 락을 갖게 되고, 다른 스레드들은 락이 없어서 임계 영역 코드를 실행할 수 없음!


스레드의 이름

public class ThreadNameExample {
	public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
        	// 익명 객체
        	public void run() {}
        });
        thread.start();
        
        // 스레드의 이름 조회 - 1
        System.out.println("thread.getName() = " + thread.getName());
        // 스레드의 이름 설정 
        thread.setName("code states");
		// 스레드의 이름 조회 - 2
        System.out.println("thread.getName() = " + thread.getName());
        
        // 스레드의 이름을 setName()으로 바꾸어주었기 때문에 1과 2의 출력값은 다르다
        
        // 스레드 인스턴스의 주소값
        System.out.println(Thread.currentThread().getName());
    }
}

스레드의 상태와 실행 제어

  • sleep()
    milli second 동안 스레드 멈춤 (정적 메소드)

  • interrupt()
    일시 중지 상태인 스레드를 실행 대기 상태로 복귀

  • yield()
    다른 스레드에게 실행 양보

  • join()
    다른 스레드의 작업이 끝날 때까지 기다림 (인스턴스 메소드)

  • wait(), notify()
    두 스레드가 교대로 작업할 때 사용

profile
어쩌다보니 tmi뿐인 블로그😎

0개의 댓글