[JAVA] Thread
- 언어/자바
- 2020. 8. 13.
Thread의 개념
[멀티 태스킹]
OS에서 여러개의 프로세스가 실행되고 일을 처리하는것.
[스레드]
프로세스 내에서 실행되는 각각 일을 하고있는 작은 프로세스 단위를 스레드라고 한다.
프로세스가 끝나도 스레드가 수행을 끝낼때까지는 스레드는 끝나지 않는다.(독립적)
멀티 스레드
두개 이상의 스레드를 사용하고 있는것. (병행적으로 처리)
스레드의 생명주기
New - 스레드가 만들어진 상태. (start()를 하는순간 runnable로 감( run()으로 직접호출 X)
Runnable - 스레드 객체가 생성된 후에 start()메서드를 호출하면 Runnable 상태로 이동(스케줄러가 호출 할 수 있는 대기실)
running - 멀티스레드를 사용할때 동시에 일을 시작하지않고 스케쥴러에 의해 먼저 호출된 스레드가 일을한다.
Blocked - 스레드가 특정한 이유로 Running상태에서 Blocked 상태로 이동한다.(그럼 다음 순번 스레드가 일을한다.)
blocked 상태에선 스케줄러가 호출이 불가능하고 자신의 순번이 올때 runnable로 가서 다시 호출이 된다.
Dead - 스레드가 종료되면 그 스레드는 다시 시작할 수 없게 된다.
스레드 생성방법
Thread 클래스를 상속 받는 방법(이걸 사용하면 다른클래스 상속 불가)
public class Thread1 extends Thread{ //스레드 상속 public void run() { } public static void main(String[]args) { Thread1 ct = new Thread1(); ct.start(); } } |
Runnable 인터페이스를 구현하는 방법 (다중상속해결책)
(스레드를 사용할수있는 환경을 만드는것뿐 스레드가 되는건 아님)
public class Runnable1 implements Runnable { //runnable 인터페이스 상속 public void run() { } public static void main(String[] args) { Runnable1 ct = new Runnable1(); Thread t = new Thread(ct); t.start(); } } |
자바 스레드 스케줄링 방식
선점형 스레드 스케줄링
스레드의 우선권을 가지고 우선순위가 높은 스레드를 먼저 수행시키는 방식
스레드 스케줄러
멀티 스레드가 수행될 때 어떤 스레드가 먼저 수행될지는 스레드 스케줄러가 결정하게 된다.
동기화
하나의 자원을 여러 스레드가 같이 사용할때 무조건 동기화를 해줘야 한다.(화장실)
동기화를 처리하기 위해 모든 객체에 락(lock)을 포함 시켰다.
어떤 자원을 쓸때 락을 걸면 다른 쓰레드가 사용 할 수 없다. (문잠금)
동기화 방법
public void nomalMethod(){
synchronizedMethod(){ //동기화할 객체 또는 클래스명
}
동기화처리의 주의점
1.공정 - 여러개의 스레드가 하나의 컴퓨팅 자원을 사용하기 위해 동시에 접근하는 프로그램을 작성할
경우 모든 스레드는 공정하게 그 자원을 사용할수잇게 해줘야함
2.기아
3.교착상태 - 두 개이상의 스레드가 결과를 내지 못하고 기다리고 있는 상태
Object 클래스의 wait(),notify(),notifyAll() 세가지 메소드 이용
동기화된 스레드는 동기화 블록에서 다른 스레드에게 제어권을 넘기지 못한다.
스레드간의 통신하기 위해선 위의 세가지 메서드를 사용하면 된다.
이 메서드는 synchronzied블록에서만 의미가 있다.
'언어 > 자바' 카테고리의 다른 글
[JAVA] double을 int로 형변환 하는 방법을 알아보자. (0) | 2020.08.31 |
---|---|
[JAVA] 자바 네트워크 개념 (0) | 2020.08.16 |
2020-08-12 #추상클래스와 인터페이스 (0) | 2020.08.12 |
2020-08-11 # List (0) | 2020.08.12 |
2020-08-10 ArrayList 기본개념 (0) | 2020.08.10 |