각 프로세스는 서로 독립적이여서
하나의 프로세스에서 오류가 나더라도
다른 프로세스에 영향을 미치지않음
멀티 스레드는 하나의 프로세스 내부에 생성되기 떄문에
하나의 스레드가 예외를 발생시키면
프로세스 자체가 종료될 수 있음
싱글 스레드는 어플리케이션은 메인 스레드가 종료되면 어플리케이션 종료
멀티 스레드 어플리케이션은 실행 중인 스레드가 하나라도 있으면 종료되지 않음
작업 스레드 생성과 실행
멀티 스레드로 실행하는 프로그램 개발시
몇 개의 작업을 병렬로 실행할지 결정하고
각 작업별로 스레드 생성
스레드도 객체로 생성
java.lang.Thread 클래스를 직접 객체화 해도 되지만
상속해서 하위클래스로 객체생성도 가능
Thread 클래스로부터 직접 생성
Thread thread = new Thread(Runnable target);
Runable은 인터페이스 타입이기 때문에 구현 객체를 만들어 대입
Runnable에는 run()메소드가 하나 정의되어 있음
구현 객체에서 run()메소드 재정의
Class Task implements Runnable{
@Override
public void run(){
//스레드가 실행할 코드
}
}
Runnable은 작업 내용을 가진 객체이지 실제 스레드는 아님
Runnable의 구현 객체를 매개값으로 해서 Thread 생성자를 호출해야 비로소 스레드
Runnable task = new Task();
Thread thread = new Thread(task);
Thread 생성자 호출시 Runnable 익명 객체를 매개값으로 사용가능
Thread thread = new Thread(new Runnable(){
@Override
public void run(){
//스레드가 실행할 코드
}
});
작업 스레드는 생성되는 즉시 실행되는 것이 아니라
start()메소드를 호출해야 비로소 실행
thread.start();
Thread 하위 클래스로부터 생성
Thread 클래스를 상속한 후 run() 메소드를 재정의 해서
스레드가 실행 할 코드 작성
public class WorkerThread extends Thread{
@Override
public void run(){
//스레드가 실행할 코드
}
}
코드를 좀 더 절약하기 위해 익명 객체로도 가능
public class WorkerThread extends Thread{
public static void main(String[] args){
Thread thread = new Thread(){
public void run(){
//실행 할 코드
}
};
}
}
메인 스레드는 main이라는 이름을 가지고 있고
우리가 직접 생성한 스레드는 자동으로 Thread-n이라는 이름으로 설정
이름을 바꾸고 싶으면
thread.setName("스레드이름");
이름을 알고 싶으면
thread.getName();
스레드 객체의 참조를 가지고 있지 않다면
Thread클래스의 정정 메소드 current로 현재 스레드의 참조 얻기 가능
Thread thread = Thread.currentThread();
동기화 메소드
멀티 스레드 프로그램에서 스레드들이
객체를 공유해서 작업해야 하는 경우
객체를 공유해서 작업하는 경우
스레드A가 사용하던 객체를
스레드B가 상태를 변경할 수 있음
이 경우 스레드A가 의도했던 것과는 다른 결과를 산출할 수도 있음
스레드 작업이 끝날 때 까지 객체에 잠금을 걸어서
다른 스레드가 사용할 수 없게할 필요가 있음
멀티 스레드 프로그램에서 단 하나의 스레드만
실행할 수 있는 코드영역을 임계영역이라 함
임계영역을 지정하기 위한 동기화 메소드
동기화 메소드 키워드 synchronized
public synchronized void method(){
//임계영역
}
스레드가 동기화 메소드를 이용하는 즉시 객체에는 잠금이 일어나고
동기화 메소드 실행 종료시 잠금이 풀림
Thread 클래스로 부터 직접 생성과
Thread 하위 클래스로부터 생성의 차이
public class ThreadExample{
public static void main(String[] args){
Thread thread1 = new MovieThread();//Thread하위클래스로부터 생성
thread1.start();
Thread thread2 = new Thread(new MusicThread());//Thread 클래스 직접생성
thread2.start();
}
}
public class MusicThread implements Runnable{
@Override
public void run(){
//Thread클래스로 직접 생성
}
}
public class MovieThread extends Thread{
@Override
public void run(){
//Thread하위 클래스로부터 생성
}
}