java

thread

Minji May Gil 2016. 5. 9. 11:47

멀티 태스킹(Multi-tasking, 다중작업) - 여러 개의 프로세스가 동시에 실행되는 것처럼 보이는 것

멀티 쓰레딩 - 하나의 프로세스 내에서 여러 쓰레드가 동시에 작업을 수행하는 것

 

멀티 쓰레딩의 장점
- CPU의 사용률을 향상시킨다
- 자원을 보다 효율적으로 사용할 수 있다
- 사용자에 대한 응답성이 향상된다
- 작업이 분리되어 코드가 간결해진다

 

멀티쓰레딩의 단점
-멀티쓰레드 프로세스는 여러 쓰레드가 같은 프로세스 내에서 자원
을 공유하면서 작업을 하기 때문에 발생할 수 있는 동기화
(synchronization), 교착상태(deadlock)와 같은 문제들을 고려해서
신중히 프로그래밍해야 함
- 교착상태 : 두 쓰레드가 자원을 점유한 상태에서 서로 상대편이 점
유한 자원을 사용하려고 기다리느라 진행이 멈춰있는 상태를 말함

 

쓰레드를 구현하는 방법

1. Thread 클래스를 상속받는 방법
2. Runnable 인터페이스를 구현하는 방법
 쓰레드 클래스가 상속해야 할 또 다른 클래스가 존재하는 경우 사용

 

실행중인 thread 이름과 개수 구하기

public class TreadTest {
    public static void main(String[] args) {
        System.out.println("main 메서드입니다");
        Thread current =Thread.currentThread();
        System.out.println("현재 실행중인 스레드 이름:"+current.getName());
        int cnt=Thread.activeCount();
        System.out.println("실행중인 스레드 갯수="+cnt);
        
        Thread.currentThread().setName("Prime");
        System.out.println("변경된 쓰레드 이름:"+Thread.currentThread().getName());
    }
}

 

thread 클래스 상속

public class MyThread1 extends Thread {

    public MyThread1(String name){
        super(name);//setName(name);
    }
    public void run(){
        for(int i=0;i<5;i++){
            System.out.println(getName());//Thread 상속받아서 조상인 thread의 메서드 getName()을 직접 호출
        }
        
    }
}

 

runnable 인터페이스 구현

public class MyThread2 implements Runnable{
    public void run(){
        for (int i = 0; i < 5; i++) {
            //thread.currentThread() - 실행중인 Thread를 반환
            System.out.println(Thread.currentThread().getName());
           //runnable 구현하면 Thread클래스의 static메서드인 currentThred()를 호출하여 쓰레드에 대한 참조를 얻어와야만 
//Tread클래스의 메서드를 호출 가능 } } }

 

thread 실행

public class ThreadEx1 {

    public static void main(String[] args) {

        MyThread1 t1=new MyThread1("나의 쓰레드1");
        MyThread2 r=new MyThread2();
        Thread t2=new Thread(r);//thread의 생성자:Thread(Runnable Target)
        
        t1.start();
        t2.start();
        //t1.start(); //exeption 발생, 새로운 쓰레드 생성후 start()할 것
        
        System.out.println("main 쓰레드 종료");
    }
}

 

*start() 메모리 공간의 할당 등 쓰레드의 실행을 위한 기반을 마련한 다음에 run 메서드를 대신 호출해 줌

**모든 쓰레드는 자신의 스택을 할당 받는다. 그러나 힙과 메소드 영역은 모든 쓰레드가 공유한다.

- CPU 이외의 자원을 사용하는 경우 - 싱글쓰레드 프로세스보다 멀티쓰레드 프로세스가 더 효율적
   
***int getPriority() : 쓰레드의 우선순위를 반환
    void setPriority(int newPriority) :쓰레드의 우선순위를 지정한 값으로 변경
    public static final int MAX_PRIORITY=10 //최대 우선순위
    static int MIN_PRIORITY=1 //최소 우선순위
    static int NORM_PRIORITY=5 //보통 우선순위