Java 컴파일러는 Java 소스 코드를 바이트코드(bytecode)로 컴파일 한다.
Java 가상 기계(virtual machine)가
Java 바이트코드 파일(컴파일된 파일)을 메모리에 읽어들여서 실행한다.
스레드는 CPU가 바이트 코드를 하나씩 순서대로 실행하고 있는 것이다.
멀티스레드는 CPU(멀티 코어)에서 각각의 코어가 독립적으로 바이트 코드를 실행하고 있는 것이다. 즉, 여러개의 스레드가 동시에 실행되는 형태이다.
메인스레드는 Java 프로그램을 실행하면 main 메소드부터 실행이 시작되는데, 이렇게 main 메소드부터 실행이 시작되는 실행 흐름이다.
실행 흐름 생성
Thread 클래스의 start 메소드를 호출하면 새 실행 흐름이 생성된다.
Thread 객체를 생성하는 것은 객체만 생성할 뿐이고, 새 실행 흐름이 생성되는 것은 아니다.
start 메소드를 호출할 때 새 실행 흐름이 생성된다.
구현방법은 두가지가 있다.
구현방법1
1. Thread 클래스를 상속하여 자식 클래스를 구현하고, 자식 클래스에서 run 메소드를 재정의한다.
2. 자식 클래스의 객체를 생성한다.
3. 자식 객체의 start 메소드를 호출하면 새 실행 흐름이 생성되어, 자식 객체의 run 메소드를 실행하게 된다.
구현방법2
1. Runnable 인터페이스를 구현한 자식 클래스를 구현하고, 자식 클래스에서 run 메소드를 재정의한다.
2. 자식 클래스의 객체를 생성한다.
3. 자식 클래스의 객체를 파라미터로 Thread 객체를 생성한다.
4. 자식 객체의 start 메소드를 호출하면 새 실행 흐름이 생성되어, 자식 객체의 run 메소드를 실행하게 된다.
Thread 클래스의 join 메소드
메인 스레드가 스레드 객체의 join 메소드를 호출하면, 그 스레드의 실행흐름이 run 메소드를 리턴하여 종료될 때까지 main 메소드는 대기하다가 리턴한다
공유 변수
여러 스레드가 공유 변수를 동시에 읽고 쓰는 것은 문제가 발생할 수 있다.
여러 스레드가 공유하는 변수를 읽고 쓸 때에는 락(lock)이 필요하다.
해당 공유 변수가 있는 클래스 객체에 락 걸기
synchronized (자식.class) {
...
}
공유 객체
공유되는 객체의 멤버 변수를 동시에 읽고 쓰는 것은 문제가 발생할 수 있다.
공유되는 객체의 메소드에 synchronized 키워드를 붙이면, 이 메소드를 호출할 때, 이 객체에 락(lock)이 걸리게 된다. 그래서 어느 한 순간 하나의 스레드만 이 객체의 메소드를 호출할 수 있어서 안전하다.
synchronized method(params) {
...
}
'Java' 카테고리의 다른 글
Object 클래스 (0) | 2020.01.15 |
---|---|
JVM, JRE, JDK, 메모리 구조 (0) | 2020.01.15 |
Iterator Interface (0) | 2019.07.07 |
ArrayList Class (0) | 2019.07.07 |
streamAPI의 오해 - for문 (0) | 2019.06.09 |