개발자 꼬부기의 성장일기
19일차 Java 심화(Effective) (2) : 스레드, JVM 본문
Thread
프로세스는 실행 중인 애플리케이션을 의미한다. 데이터, 컴퓨터 자원, 그리고 스레드로 구성.
스레드는 데이터와 애플리케이션이 확보한 자원을 활용하여 소스 코드를 실행.
메인스레드
자바 어플리케이션을 실행하면 가장 먼저 실행되는 main 메서드, 메인 스레드가 메인 메서드를 실행시켜줍니다.
메인 메서드의 코드를 처음부터 끝까지 차례대로 실행시키며, 코드의 끝을 만나거나 return문을 만나면 실행을 종료한다.
멀티스레드
하나의 프로세스는 여러 개의 스레드를 가질 수 있다. 여러개의 스레드를 가진다는 것은 동시에 작업을 수행할 수 있음을 의미한다. 스마트폰에서 메신저 사용시 사진을 업로드하면서 메시지 주고 받을때 멀티 스레드를 사용한 예이다.
작업스레드
모든 자바 코드는 클래스 안에 작성된다. 따라서 스레드가 수행할 코드도 클래스 내부에 작성해주어야 하며, run()이라는 메서드 내에 스레드가 처리할 작업을 작성하도록 규정되어있다.
run()메서드를 실행하는 방법
1)Runnable 인터페이스를 구현한 객체에서 run()을 구현하여 스레드를 생성하고 실행하는 방법
2) Thread 클래스를 상속받은 하위 클래스에서 run()을 구현하여 스레드를 생성하고 실행하는 방법
익명객체를 사용하여 스레드 생성하고 실행하는 방법
1) 익명객체를 사용하여 스레드 생성하고 실행하는 방법
2) Thread 익명 하위 객체를 활용한 스레드 생성 및 실행
스레드 이름
스레드의 참조값.getName()하면 Thread-n(숫자) 이라는 이름이 나온다. Main스레드의 경우 main 으로 나온다.
스레드 이름 설정하기
스레드의 참조값.setName() 으로 설정할 수 있다.
thread4.setName("JavaThread1");
System.out.println("thread4.getName() = " + thread4.getName());
//출력결과: thread4.getName() = JavaThread1
스레드 인스턴스의 주소값 얻기
Thread클래스의 정적 메서드인 currentThread()로 얻을 수 있다.
System.out.println(Thread.currentThread().getName());
스레드 동기화
: 멀티 스레드 프로세스의 경우, 두 스레드가 같은 데이터를 공유하게 되어 문제가 발생
임계영역과 락
임계영역 : 두 스레드가 동시에 실행하면 안 되는 영역을 설정
특정 코드 구간을 임계 영역으로 설정할 때는 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) 특정한 영역만 임계영역으로 지정하기
특정 영역을 임계 영역으로 지정하려면 아래와 같이 synchronized 키워드와 함께 소괄호(()) 안에 해당 영역이 포함된 객체의 참조를 넣고, 중괄호({})로 블록을 열어, 블록 내에 코드를 작성하면된다.
class Account{
...
public boolean withdraw(int money) {
synchronized (this) {
if (balance >= money) {
try { Thread.sleep(1000); } catch (Exception error) {}
balance -= money;
return true;
}
return false;
}
}
}
스레드의 상태와 실행 제어
NEW, RUNNABLE, TERMINATED, WAITING, BLOCKED
스레드 처음 생성 => NEW 상태
Start() => RUNNABLE 상태
getState() : 현재 상태확인할수있는 메서드
Start() 전: NEW
Start() 후: RUNNABLE
스레드 끝: TERMINATED
자바 가상머신 JVM
: JVM은 자바로 작성한 소스 코드를 해석해 실행하는 별도의 프로그램
자바는 운영체제로부터 독립적이다.
프로그램이 실행되기 위해서는 CPU, 메모리, 각종 입출력 장치 등과 같은 컴퓨터 자원을 프로그램이 할당받는다.
프로그램이 자신이 필요한 컴퓨터 자원을 운영체제에게 주문하면, 운영체제는 가용한 자원을 확인한 다음, 프로그램이 실행되는 데에 필요한 컴퓨터 자원을 프로그램에게 할당해준다.
자바는 JVM을 매개해서 운영체제와 소통한다. 그래서 Windows용 JVM, Mac OS용 JVM, Linux용 JVM이 따로 존재한다.
'언어공부 > [코드스테이츠] 백엔드부트캠프' 카테고리의 다른 글
20일차 - Section 1 마치며 (0) | 2023.05.09 |
---|---|
17일차 - Java 심화(Effective) (1) : 람다, 스트림, 파일입출력 (0) | 2023.05.09 |
16일차 - 코플릿 문제풀기(컬렉션) (0) | 2023.05.02 |
15일차 - Java 컬렉션 (열거형, 제너릭, 예외처리, 컬렉션프레임워크) (0) | 2023.05.01 |
12일차 - Java 객체지향 심화(2) : 다형성, 추상화 (0) | 2023.04.26 |