Thread(스레드)란?
프로세스 내에서 실행되는 흐름의 단위
예를 들어 호랑이가 있다고 하였을 때 호랑이가 잠자는 행위를 하나의 스레드로 본다.
즉 일반적인 스레드는 동시 작업이 불가능하다.
예를 들어서 호랑이가 자면서 먹이를 먹을 수 없는 것 처럼 말이다.
위의 코드는 Thread_Class클래스가 Thread클래스를 상속받아서 생성하였다.
Thread_Class클래스는 Thread클래스를 상속받아 run()이라는 Thread클래스의 메소드를 오버라이딩하여서 사용하였다.
Thread클래스의 특징은 바로 start()메소드를 통해 스레드가 시작되는 특징이 있다.
위처럼 start()메소드를 호출하면 run()메소드가 실행되고 main스레드가 아닌 다른 스레드에서 실행되는 것을 확인할 수 있다.
Runnable
1개의 메소드만을 갖는 함수형 인터페이스
위의 사진은 Runnable인터페이스의 구조인데 run()이라는 추상메소드가 존재한다.
따라서 Runnable인터페이스는 람다식으로도 표현이 가능하다.
위에서 설명한 Thread클래스는 run()메소드를 무조건 오버라이딩을 해야하는데 그 이유가 바로 Thread클래스가 Runnable인터페이스를 구현하고 있기 때문이다.
위처럼 Runnable인터페이스는 람다식으로도 표현이 가능하다.
Thread vs Runnble
그렇가면 Thread클래스와 Runnable인터페이스의 차이는 무엇일까?
Thread클래스는 상속을 해야하지만, Runnable인터페이스는 상속이 필요하지 않다.
또한 Thread는 Runnable인터페이스를 구현하지만 클래스이기 때문에 람다식으로 표현이 불가능하지만
Runnable인터페이스는 람다로 표현이 가능하다.
Multi Thread
하나의 프로세스에서 여러 개의 작업을 하도록 해주는 기능
위처럼 멀티스레드는 두 개의 스레드가 동시에 실행되는 스레드를 의미한다.
위는 Runnable 인터페이스를 이용하여 멀티스레드를 구현한 것을 의미한다.
그럼 멀티스레드는 정말 좋은 스레드일까?
마냥 그렇지만은 않다.
<멀티스레드의 문제점>
1. 동시성
2. 데드락
동시성 문제
동시성이란? 동시에 실행되는 것 같아 보이는 것을 의미
(싱글 코어에서 멀티 스레드를 동작시키는 방식을 의미한다)
동시성 문제에는 어떤 것이 있을까?
대표적으로 입금과 관련된 예가 있다.
프로세스 P1이 통장에 있던 예금 15만원을 확인하고, 잠시 작업을 멈추고 프로세스 P2에게 cpu가 할당이 되고
P2가 예금을 확인하고 예금에 10만원을 더하여 저장을 하고 P1에게 작업이 할당이 되고 P1이 예금에 15만원을 더하여
저장을 하면 예금은 30만원이 맞을까?
이것이 바로 동시성 문제이다.
동시성을 해결하기 위한 방법은 하나의 프로세스가 수행중일 때 다른 프로세스에게 락을 거는 방법이다.
하지만 여기서 락을 걸면 동시성문제가 해결되지만 락을 걸음으로써 "교착상태" 문제가 발생할 수 있다.
교착상태(deadlock)
두 개의 스레드에서 서로가 가진 락을 해제되기를 무한정 대기하는 상태
동시성을 해결하기 위해서 락을 거는 데 이 때문에 데드락이라는 현상이 발생하게 된다.
자바에서는 동시성을 해결하기 위해 synchronized을 사용한다.
여기서 임계영역이라고 있는데 임계영역이란?
<임계영역>
한 순간 반드시 프로세스 하나만 진입해야 하는데, 프로그램에서 임계 자원을 이용하는 부분을 의미한다.
'JAVA' 카테고리의 다른 글
[JAVA] 제네릭 < > (0) | 2023.05.23 |
---|---|
[JAVA] Enum(열거 타입) (0) | 2023.05.17 |
[JAVA] 패키지&import & 접근 제어 지시자 (0) | 2023.04.26 |
[JAVA] Object클래스 (0) | 2023.04.25 |
[JAVA] final 키워드 (0) | 2023.04.23 |