Java/Theory

[Java/Theory]22. Thread

양승길 2016. 5. 31. 13:11

22. Thread(Multi - Thread)

    * Process : 실행중인 프로그램

    * Thread : 프로세스에서 실행되는 흐름의 단위

    * 사용이유 : 여러개의 프로세스를 실행하면 메모리에 부담이 되므로

                    하나의 프로세스에 여러가지의 처리를 하는 것이 메모리와 운영체제 입장에서 효율적이다.  


  * Java에서 동작되는 Thread의 원리

      JVM에는 Thread Scheduler가 있다.

      이 곳에서 기본적으로 동작되는 Thread가 main method다.


      Thread Scheduler에 다른 Thread를 진입하기 위해서는 

      start method를 가진 Instance가 필요하다.


      Thread Scheduler에 유일하게 접근이 가능한 start는

      Thread를 구현한 run을 Thread Scheduler에 위임한다.


      Thread Scheduler에 Thread를 알맞게 Scheduling한 JVM은

      운영체제에 있는 Process Scheduler에 전달하여

      해당 Process를 동작 시킬 수 있다.


  * 구현방법

      하나.

1
2
3
4
5
6
7
8
9
10
public class ThreadTest extends Thread{
    public void run(){
        // implementation
    }
 
    public static void main(String [] args){
        ThreadTest threadTest = new ThreadTest();
        threadTest.start();
    }
}
cs

    

      두울

1
2
3
4
5
6
7
8
9
10
11
public class ThreadTest extends SuperClass implements Runnable{
    public void run(){
        // implementation
    }          
 
    public static void main(String [] args){
        ThreadTest threadTest = new ThreadTest();
        Thread thread = new Thread(threadTest);
        thread.start();
    }           
}
cs


  * Thread의 특징

      Thread는 운영체제와 해당 Thread의 Data 자원을 공유하고 있다.

      그러나 이 자원들을 공유하는데 있어 한 Thread가 자원을 점유 할 때,

      다른 Thread도 같이 점유하게 되어 자원의 일관성에 대한 문제가 발생된다.

      이러한 문제를 동기화 문제라고 한다.


      ->synchronized

        동기화 문제를 해결하기 위한 Keyword

        synchronized로 처리된 Instance는 자원접근을 위한 Key를 갖게된다.

        선언된 Thread가 자원에 접근할 때, 그 Key를 가지고 자원을 사용하고 반납하는 주기를 갖는다.

        이때, JVM은 다른 Thread가 자원을 접근하는 것을 막아놓는다.


    * Method에 선언

          해당 Method가 실행되고 있는 동안에 동기화를 보장한다.        


    * Block구간에 선언

1
2
3
synchronized (this)    {
    // implementation
}
cs

          여기서 사용된 this 객체는 자기 자신 

          즉, 현재 이 Method를 수행하고 있는 객체에 대해서 동기화를 시킨다는 의미다.


    * Overhead

          동기화 구문이 커질수록 다른 작업은 그에 따라 작업 수행 속도가 저하될 수 있다.


          여러 Thread가 여러 자원에 대해서 독립적으로 동기화 되어야 하기 때문에

          synchronized가 발생되는 동안에는 해당 구간에 대해서만 동기화를 확실히 수행하는 것이다.


          Block구간에 선언하여 Overhead를 최소화 한다.


    * Deadlock

          두 Thread가 자원을 가진 상태에서, 서로 자원의 점유를 해제하기만을 기다리는 상황으로 

          작업이 진행되지 않고 영원히 기다리게 되는 상황을 말한다.


   * Thread Life Cycle

      구성

      1. Runnable : start()에 의한 Thread들이 실행하기전 대기하는 영역

                    FIFO구조.

      2. Run :      Scheduler에 의하여, 한개의 Thread가 실행하는 영역

      3. Blocked :  특정 Method(wait, sleep, join, intterupt)나 Scheduler등의 이유로 

                    Thread가 대기하는 영역.

                    Synchronized pool, Sleep pool등등이 있다. 

                    notify나 shynchronized에 의하여 이 곳에 있는 Thread는

                    Runnable에 대기한다.(중간에 들어갈 수 있음)


      4. Dead    : 해당 Thread가 끝나면 들어가는 영역. 재생성 불가.

'Java > Theory' 카테고리의 다른 글

[Java/Theory]24. I/O Object전송과 Serialization  (0) 2016.07.29
[Java/Theory]23. JDBC  (0) 2016.05.31
[Java/Theory]21. Maker Interface  (0) 2016.05.31
[Java/Theory]20. IO  (0) 2016.05.31
[Java/Theory]19. interface기반, Inner class, instanceof  (0) 2016.05.31