본문 바로가기

프로그래밍/Java

멀티 스레드

프로세스와 스레드

 

각 프로세스는 서로 독립적이여서

하나의 프로세스에서 오류가 나더라도

다른 프로세스에 영향을 미치지않음

 

멀티 스레드는 하나의 프로세스 내부에 생성되기 떄문에

하나의 스레드가 예외를 발생시키면

프로세스 자체가 종료될 수 있음

 

싱글 스레드는 어플리케이션은 메인 스레드가 종료되면 어플리케이션 종료

멀티 스레드 어플리케이션은 실행 중인 스레드가 하나라도 있으면 종료되지 않음

 

 

작업 스레드 생성과 실행

멀티 스레드로 실행하는 프로그램 개발시

몇 개의 작업을 병렬로 실행할지 결정하고 

각 작업별로 스레드 생성

스레드도 객체로 생성

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하위 클래스로부터 생성
    }
}

'프로그래밍 > Java' 카테고리의 다른 글

Java api  (0) 2019.12.10
예외 처리  (0) 2019.12.07
예외 클래스  (0) 2019.12.07
익명객체  (0) 2019.12.06
중첩 클래스와 중첩 인터페이스  (0) 2019.12.05