쓰레드

Lumi·2021년 6월 30일
0

자바의 정석

목록 보기
1/35
post-thumbnail

1. 프로세스와 쓰레드

프로세스 : 실행중인 메모리를 의미 [필요한 메모리를 할당받아서 프로그램이 프로세스가 된다]

쓰레드 : 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것

멀티쓰레드와 싱글 쓰레드로 나뉘어져 있다.
-> 하나의 프로세스가 가질 수 있는 쓰레드의 갯수는 제한되어 있지 않다.

쉽게 설명하면 프로세스는 광산이며 쓰레드는 광부라고 생각하면 된다.

메신저로 채팅을 하면서 파일을 다운로드 받을수 있는 것도 멀티쓰레드의 힘이다.

2. 쓰레드의 구현과 실행

  1. Thread클래스를 상속받는 방법
  2. Runnable인터페이스를 구현하는 방법

Runnable인터페이스를 구현하는 방법이 일반적이다.

Runnable인터페이스를 구현한 경우, Runnable인터페이스를 구현한 클래스의 인스턴스를 생성한 다음, 이 인스턴스를 Thread클래스의 생성자의 매개변수로 제공을 해야 한다.

Thread를 상속받은 t1에서는 간단하게 getName()을 호출하면 이름을 반환 하지만

Runnable을 구현한 t2에서는 Thread.currentThread().getName()라는 코드를 이용 해야 한다.

start()

쓰레드를 실행하는 코드다.
호출하게 된다면 실행대기 상태에 있다가 차례가 되면 쓰레드가 실행이 된다.

하나의 쓰레드에 대해 start()가 한 번만 호출될 수 있다.

3. start()와 run()

main메서드에서 run()을 호출하는것은 단훈하게 클래스에 선언된 메서드를 호출하는것이다.
-> 쓰레드를 실행시키는 것이 아니다.

start()를 사용하게 되면 쓰레드가 작업할수 있는 하나의 호출스택이 새로 생겨나게 되고, 이 호출 스택에서 run을 실행하게 된다.
모든 쓰레드는 독립적인 작업을 위해 자신만의 호출 스택이 필요하기 떄문에

만약 실행중인 쓰레드가 하나도 없다면 프로그램은 종료된다.

4. 싱글쓰레드와 멀티쓰레드

시스템의 성능 자체는 싱글쓰레드가 우수하다.
-> 멀티 쓰레드 같은 경우에는 작업을 전환하는데에 시간이 추가로 소요되기 때문에
-> 대신 활용성은 멀티쓰레드가 우수하다.

두 쓰레드가 서로 다른 자원을 사용하는 작업의 경우에는 멀티 프로세스를 사용
example : 입력과 출력, 파일을 주고받는 작업, 프린터로 파일을 출력
== 외부기기 와의 입출력을 필요로 하는 경우

5. 쓰레드의 우선순위

작업의 중요도에 따라서 쓰레드의 우선순위를 서로 다르게 지정하여 특정 쓰레드가 더 많은 작업시간을 갖도록 지정할수가 있따.

가질수 있는 우선범위는 1~10이며 우선순위는 상속을 받는다.
example : main의 우선순위는 5이며 main에 호출된 쓰레드의 우선순위도 자동으로 5가 된다.

우선순위는 쓰레드를 실행하기 전에만 변경할수 있다.

사용법

쓰레드변수명.setPriority(우선범위)

6. 쓰레드 그룹(741p)

서로 관련된 쓰레드를 그룹으로 다루기 위한 것

쓰레드를 쓰레드 그룹에 포함시키려면 반드시 Thread의 생성자를 이용해야 한다.
모든 쓰레드는 반드시 쓰레드 그룹에 포함되어 있다

7. 데몬쓰레드

일반 쓰레드의 작업을 돕는 보조적인 역할
-> 일반 쓰레드가 모두 종료되면 데몬 쓰레드 또한 종료가 된다.

가비지 컬렉터, 자동저장, 화면자동갱신 등에 사용 된다.

8. 쓰레드의 실행제어(748p)

sleep(), interrupt(), interrupted(), suspend(), resume(), stop(), yeild(), join() 등등 다양하게 있으니

후에 쓰레드를 직접 사용할때에 교재를 참고

9.쓰레드의 동기화

쓰레드를 여러개 사용하게 된다면 한 쓰레드가 특정 작업을 끝마치기 전까지 다른 쓰레드가 방해하지 않도록 하는것이 필요한데 이것을 동기화 라고 한다.

1. synchronized를 이용한 동기화

임계 영역을 설정하는데 사용된다.
두가지 방법이 있으며
1. 메서드 앞에 사용
2. 코디 일부를 {}으로 감싸서 사용

synchronized는 단순히 지정된 영역의 코드를 한 번에 하나의 쓰레드가 수행하는 것을 보장 하는 역할을 한다.

2. wait()과 notify()

특정 쓰레드가 lock를 오랜 시간 보유하는것을 막을떄에 사용한다.

wait() : 쓰레드가 락을 반납하고 기다리게 한다.
-> 선언한 시간 동안만 기다린다(이후는 자옹으로 notify가 선언)
notify() : wait선언된 쓰레드가 다시 작업을 진행해야 할떄에 선언한다.

문제점은 waiting pool에 대기중인 모든 쓰레드중 임의의 쓰레드에게만 연락이 간다. == 특정 쓰레드를 추릴수가 없다.

보통 동기화는 여러 객체가 거쳐가는 객체 또는 메서드를 동기화 시킨다.

profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글