Java/Java Concept

[Java] Thread

군우 2018. 3. 13. 16:30

쓰레드와 동기화


실행중인 프로그램을 프로세스라고 함.

운영체제 입장에서 가상머신은 하나의 프로그램이므로 

가상머신도 프로세스이다.


자바가상 머신위에서도 동작하는 프로그램도 프로세스라고 얘기한다.

프로세스는 os관점에서 프로그램의 흐름을 이루는 하나의 독립적인 흐름을 의미한다.



프로세스는 쓰레드를 담는 그릇이고  실제 역할을 담당하는 것은 쓰레드다.

프로세스 실행과 동시에 만들어진다. 그 쓰레드가 메인 쓰레드이다.


쓰레드는 모든 일의 기본 단위이다. main 메소드를 호출하는 것도 프로세스 생성시

함께 생성되는 main 쓰레드를 통해서 이뤄진다.


쓰레드간의 힙을 공유한다.

메소드영역도 공유한다.

하지만 스택은 공유 할 수 없다.

각 실행별 스택이 독립적으로 존재 해야한다 .

쓰레드가 별도의 실행흐름을 갖기 때문에 스택을 별도로 가질 수 밖에 없다.


쓰레드 클래스

쓰레드를 생성하기위해서 쓰레드가 할일을 정의해놓은 클래스를 말한다.

run이라는 메소드를 오버라이딩하는데 이게 쓰레드의 MAIN메소드이다.

1. 쓰레드를 상속하는 클래스를 정의하고

2. 그 안에서 run이라는 메소드 정의해야한다.

3. 쓰레드 호출하는 인스턴스를 만든다.

4. 인스턴스를 이용해서 s.start()메소드로 실행한다.


run이라는 메소드도 main처럼 쓰레드의 생성과동시에 호출된다.

start를 런의 실행뿐만 아니라 쓰레드의 물리적생성 등등의 생성을 함께

명령하는 것이다.


프로세스안의 모든 쓰레드가 종료가되어야지 프로세스도 함께 종료가됩니다.  

쓰레드는 run메소드의 실행이 완료가되면 종료가 된다.


쓰레드클래스를 인스턴스화해서 런메소드를 호출하는데, 

인스턴스가 쓰레드라고하기도 하는데, 사실 쓰레드의 인스턴스이고

실행흐름을 위한 모든것을 쓰레드라고 할 수 있다. 

하지만 인스턴스도 편의상 쓰레드라고 한다.


쓰레드를 사용하는  두 클래스이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package thread23;
 
import java.util.concurrent.SynchronousQueue;
 
public class ThreadUnderstand
{
    public static void main(String[] args)
    {
        ThreadInfo th1= new ThreadInfo("th1");
        ThreadInfo th2= new ThreadInfo("th2###",600);
        
        th1.start();
        th2.start();
    }
}
 
class ThreadInfo extends Thread    
{    //쓰레드 정보를 모아놓은 쓰레드 상속하는 클래스
    String str;
    int num=100;
    
    ThreadInfo(String str)
    {
        this.str = str;
    }
    ThreadInfo(String str, int num)
    {
        this.str = str;
    }
    
    public void run()    //쓰레드 실행시 
    {
        System.out.println("RUN RUN");
        for(int a = 0; a<10;a++)
        {
            System.out.println(str);
            try
            {
                sleep(num);
            }
            catch(InterruptedException e)
            {
                System.out.println("err   @@");
                e.printStackTrace();
            }
        }
    }
}
cs