쓰레드

1.쓰레드.


- 스택 : 호출된 메소드가 일을 하는 곳. 쓰레드라고도 한다.

스택은 메소드가 일을 하는 곳이다. 순차적으로 메소드를 실행 후, 메소드의 일이 끝나면 스택에서 지워버린다.


- 단일 쓰레드(스택)로는 여러개의 메소드를 동시에 처리할 수 없다. 이를 동시에 실행 가능하도록 하는것이 멀티 쓰레드이다.


- 동기화 :  처음 메소드가 접근하면 접근되는 메소드, 변수를 락을 건다. 락 중에 다음 메소드가 접근하면 처리를 하지 못하고 대기상태에 있게 된다.


쓰레드(스택)을 여러개 만들고, 동시에 메소드를 처리한다.

하지만 동시에 실행된 메소드들이 하나의 데이터를 처리 할때 문제가 생긴다. 이를 위한 기술이 동기화다.


 a지점에서 출금 요청한 것이 처리되기 전에 b지점에서 출금 요청하면, 출금이 2번 일어나게 된다. 심각한 문제다.

그래서 동기화라는 것이 있다.


a지점의 요청을 처리하기 전에 b가 요청을 했지만 a의 요청 처리가 끝날때 까지 대기 상태로 있다가, 처리가 끝나자 이미 남은 1000원은 출금 되어 b지점에서 출금이 안된다.


하지만 동기화로 인해 문제가 생기는 경우가 있다.



- 데드락 : 무한대기상태에 빠지는 것.




- 쓰레드 생성.


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
public class test{
    public static void main(String[] a){
        MyThreadOne one = new MyThreadOne();
        one.start();//첫번째 쓰레드 생성.
        
        Thread two = new Thread(new MyThreadTwo());
        two.start();//두번째 쓰레드 생성.
        
        Thread three = new Thread(){
            @Override
            public void run() {
               //세번째 쓰레드가 해야 할 일.
            }
        }
        
        three.start();//세번째 쓰레드 생성.
    }
}
 
class MyThreadOne extends Thread{
    @Override
    public void run() {
       //새로 생성된 첫번째 쓰레드가 해야 할 일.
    }
}
 
class MyThreadTwo implements Runnable{
    @Override
    public void run() {
        //새로 생성된 두번째 쓰레드가 해야 할 일.
    }
}


1. 첫번째는 쓰레드 클래스를 상속받아 그대로 새로운 쓰레드를 만든다.


2. 두번째는 Runnable인터페이스를 구현하여 해야 할 일을 정한 후, 

쓰레드 객체를 생성할 때 새로운 쓰레드에 해야 할 일을 같이 넣는 방법.


3. 세번째는 객체를 생성할 때 익명클래스를 통해 해야할 일을 정한다.






2. 안드로이드의 멀티쓰레드.


- 메인 메소드가 있는 쓰레드를 메인 쓰레드라고 한다.


- 안드로이드에서 메인쓰레드에 생성된 View들은 쓰레드간 공유가 불가능 하다.

이를 위해 핸들러가 존재하는데 뷰는 핸들러에서 요청이 가능하기 때문에 타 쓰레드에서 핸들러에 접근하면 된다.


- 핸들러도 하나의 쓰레드이다. 


- 안드로이드 쓰레드 예제

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
49
50
51
52
53
54
55
56
57
58
59
60
61
public class MainActivity extends Activity {
    TextView t1;
    TextView t2;
    int c1;
    int c2;
    Button b1;
    MyHandler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        t1 = (TextView) findViewById(R.id.textView1);
        t2 = (TextView) findViewById(R.id.textView2);
        b1 = (Button) findViewById(R.id.button1);
        handler = new MyHandler();
        MyThread thread1 = new MyThread();
        thread1.setDaemon(true);
        thread1.start();
        
        b1.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                c1++;
                t1.setText(""+c1);
            }
        });
    } 
    public class MyThread extends Thread{
        @Override
        public void run() {
            boolean flag = true;
            while(flag){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                c2++;
            //    Message msg = new Message();
            //    msg.arg1 = 0;
            //    handler.handleMessage(msg);//메세지로 보낼 객체를 추가할때 사용.
                
                handler.sendEmptyMessage(0);//위와 같은 코드이나 메세지의 내용이 없고 신호만 보낼때 사용.
            }
        }
    }
    
    public class MyHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            switch(msg.what){
            case 0 :
                t2.setText(""+c2);
                break;
            }
        }
    }
}
 


댓글()