끄적끄적
thread와 런에이블 본문
thread: 한 프로세스 안에서 동작하는 실행 단위
Thread의 생성
1. Thread 클래스로부터 직접 생성
- Runnable 인터페이스를 implements 클래스 객체를 사용. Runnable 인터페이스는 run메서드를 무조건 구현해야함
public static void main(String args[]){
Runnable task = () =>{
int sum=0;
for(int i=0;i<10;i++){
sum+=i;
}
}
Thread subTread1 = new Thread(task);
Thread subThread2 = new Thread(task);
subThread1.start();
subThread2.start();
}
2. Thread 하위 클래스로부터 생성
- Thread 클래스를 상속받아 run 메서드를 오버라이딩
public class CustomThread extends Thread{
@Override
public void run(){
int sum=0;
for(int i=0;i<10;i++){
sum+=i;
}
}
}
public static void main(String args[]){
Thread subThread1 = new CustomThread();
subThread1.start();
}
- 자바에서는 다중 상속이 불가능하므로 Thread 클래스의 run 메소드 떄문에 상속으로 하는 것은 비효율적. 단순히 run()메서드만 필요한 경우는 Runnable 상속, Thread 기능 확장이 필요한 경우 Thread 클래스를 상속하면 된다.
- 참조) https://recipes4dev.tistory.com/143?category=768056)
멀티 스레드
멀티스레드의 경우 Heap, Code, Static 영역을 공유하지만 스레드 별로 각기 다른 Stack영역이 존재. 각 스레드가 자신이 속한 프로세스의 메모리를 공유하여 자원의 낭비가 적다.
멀티스레드의 병렬 처리
컴퓨터가 동시 작업할 수 있는 최대 작업의 수는 CPU core수와 같다. CPU 코어보다 많은 스레드가 실행되면 문맥교환이 발생한다. -> 스케줄링 기법 필요
동기화(Synchronized)
- 스레드들이 동일한 자원에 접근할때 -> 동기화 /lock
- 어떤 스레드가 진행 중인 작업을 다른 스레드가 간섭하지 못하도록 하는 작업
- 간섭하지 못하게 하는 영역을 임계영역(critical section)으로 설정 => synchronized 키워드 사용
- synchronized 키워드가 붙은 메서드가 호출된 시점부터 해당 메서드가 포함된 객체의 lock을 얻어 작업하다가 메서드가 종료되면 lock을 반환한다.
lock
- 해당 객체의 lock을 가지고 있는 스레드만 임계 영역의 코드를 수행할 수 있다. 한 객체당 lock은 하나밖에 없어 다른 스레드들은 lock을 얻을 때까지 기다리게 된다.
교착상태(DeadLock)
- 서로의 lock이 풀리기 기다리며 무한한 대기 상태에 빠지게 되는 것
- 발생 조건
1. 상호 배제 - 한자원에 대해 여러 스레드 동시 접근 불가
2. 점유 대기 - 최소 하나의 자원을 점유하면서 다른 스레드 자원 반납을 기다림
3. 비선점 - 다른 스레드의 자원을 중간에 가져올 수 없음
4. 순환 대기 - 각 스레드가 순차적으로 다음 스레드가 요구하는 자원을 가지고 있음
참고)
https://math-coding.tistory.com/175?category=920734
'CS 공부' 카테고리의 다른 글
람다식 (2) (0) | 2022.03.26 |
---|---|
[java]람다식(Lambda Expression) (0) | 2022.03.20 |
[java] static (0) | 2022.03.18 |
[java] 배열 리스트의 동적 동작 (0) | 2022.03.17 |
[java]String 생성과 메모리 (0) | 2022.03.17 |