19일차(스레드, JVM)

Rina's·2023년 5월 7일

코드스테이츠

목록 보기
18/96
post-thumbnail

🍬스레드(Thread)

프로세스(Process)실행중인 애플리케이션(응용 프로그램)
스레드프로세스 내의 코드 실행 흐름
멀티스레드는 멀티 스레딩을 통해 동시 작업을 가능하게 한다
서버 개발시 다수의 클라이언트 요청을 처리하기 위해 사용 됨
소스 코드 내에 직접 스레드를 생성하여 멀티스레드가 되도록 사용해 보자

프로세스는 데이터, 컴퓨터 자원, 그리고 스레드로 구성
스레드가 데이터와 컴퓨터 자원을 사용하여 소스 코드를 실행

메인 스레드
메인 메서드를 실행시키는 스레드, 코드 끝에 도달하거나 return문을 만나면 종료

멀티 스레드

메인 스레드 외의 별도의 작업스레드를 생성하여 실행시키면 된다
클래스 내부에 작성하며 run() 메서드 내에 처리할 작업을 작성

1. Runnable 인터페이스의 run() 사용

  1. Runnable 상속 A클래스 생성 run() 구현 후 객체 생성
  2. 위의 객체를 인자로 하는 Thread 객체 생성
    -> Runnable객체와 Thread객체를 각각 생성
  3. 스레드 객체.start() 로 스레드 실행
Thread thread1 = new Thread(new ThreadTask1());
thread1.start();
//ThreadTask1는 Runnable구현 클래스

2. Thread 클래스의 run() 사용

1.Thread 상속 클래스 생성 및 run() 오버라이딩 후 객체 생성
2. 스레드 객체.start() 로 스레드 실행

Threadson thread2 = new threadson();
thread2.start();

3. 익명 구현 객체로 스레드 생성

Thread thread3 = new Thread(new Runnable() {
            public void run() {}
            }
        }); //Runnable의 익명 객체에서 run()구현
thread1.start();
Thread thread4 = new Thread() {
            public void run() {}
        }; //Thread 익명 상속 객체에서 run() 오버라이딩
thread2.start();

[스레드 조회하기]

메인스레드 “main”, 추가 스레드는 기본적으로 “Thread-n”
이름 조회 .getName()
이름 설정 .setName()
상태 조회 .getState()
Thread의 static메서드 사용해서 실행중인 스레드 이름 조회하기 ->
Thread.currentThread().getName()

스레드 동기화

동시에 같은 데이터를 처리하며 생기는 오류를 막기위해 설정

임계 영역(Critical section) : 하나의 스레드만 실행 가능한 코드 영역
락(Lock) : 임계 영역 접근권한(출입증)
synchronized 키워드로 임계 영역 설정

1. 메서드 지정

class Account {
	...
	public synchronized boolean withdraw(int money) { //메서드 지정
	    if (balance >= money) {
	        try { Thread.sleep(1000); } catch (Exception error) {}
	        balance -= money;
	        return true;
	    }
	    return false;
	}
}

2. 영역지정

class Account {
	...
	public boolean withdraw(int money) {
			synchronized (this) {//영역지정 범위내에서 this(Account)객체의 락을 얻는다
			    if (balance >= money) {
			        try { Thread.sleep(1000); } catch (Exception error) {}
			        balance -= money;
			        return true;
			    }
			    return false;
			}
	}
}

스레드 실행 제어 메서드

start() sleep() wait() join()
interrupt() yield() wait()/notify()

[스레드의 상태]

Runnable
Run
Waiting Timed_Waiting Blocked
Terminated

Start()

start() 스레드를 stand-by 상태로 만들어주는 메서드
운영체제가 stand-by 스레드를 알아서 적절한 시기에 실행시켜 줌

Sleep(long milliSecond)

milliSecond동안 일시정지(Timed_Waiting)
시간이 경과하거나 interrupt()를 통해서 Runnable상태로 복귀
interrupt()사용시 try-catch문의 예외를 발생시킴

interrupt()

sleep() wait() join()에 의한 일시정지 스레드를 Runnable상태로 복귀

yield()

다른 스레드에 실행을 양보

join()/join(long milliSecond)

다른 스레드의 작업이 끝날 때까지 대기
시간경과, interrupt(), 지정 스레드가 작업을 마치면 Runnable상태로 복귀
*Sleep는 cv메서드, join은 iv메서드

wait()/notify()

상대 호출(notify)후 본인은 일시정지(wait)가 쌍으로 시행되어 교대 처리

🍮JVM

자바어 해독 실행 프로그램!
JAVA App - JVM - OS (profit!)
각 OS별 JVM버전이 내장되어 있다!

1. 클래스 로더(바이트 코드를 런타임영역에 적제)

2. 런타임 데이터 영역(Runtime Data Area)

메서드 영역(Method Area)

클래스, 인터페이스, 메서드, 상수, static 변수를 저장
클래스 영역이라고도 함

힙 영역(Heap Area)

객체, 인스턴스, 배열 저장

스택 영역(Stack Area)

참조변수, 매개변수, 지역변수, 리턴값 저장
메서드 호출시 Method Frame 생성되며 실행이 종료되면 LIFO(후입선출)로 제거 됨

PC(Program Counter) 레지스터
현재 실행 중인 JVM 명령어의 주소를 저장

네이티브 메서드 스택(Native Method Stack)
자바 외의 언어(C, C++ 등)로 작성된 네이티브 코드 실행시 저장

3. 실행 엔진(Execution Engine)

자바 어플리케이션 실행 흐름

생성 : 자바 소스코드(.java) -> 컴파일러 -> 바이트코드(.class)
로드 : OS(런타임영역 할당)-[클래스로더]->JVM(바이트코드 런타임영역 적제)
실행 : JVM 내부 실행 엔진
1) 인터프리터로 한줄 씩 번역실행 (기본)
2) JIT compiler가 통째로 번역실행 (빈번한 바이트 코드면 실행)

(.java) -complier(.class) - OS - class loader(Runtime Area) - Execution Engine

Garbage Collection

메모리 자동 정리 프로세스
참조변수가 없는 객체 및 변수의 메모리 점유를 해제
Heap 메모리에서 Young영역의 Minor GC Old영역의 Major GC으로 나뉨

[가비지 컬렉션 실행 단계]
1. Stop The World : 모든 스레드 정지
2. Mark and Sweep : 사용 식별(Mark)후 제거(Sweep)

🐶🐶🐶

스트림 코플릿 복습과 메서드 레퍼런스를 끝냈다
제네릭래스, 코플릿, 햄버거 프로그래밍 정리 남았다
profile
갭린이 리나

0개의 댓글