[Android] Thread Android 2012. 3. 6. 17:52
스레드는 한번에 여러개의 작업을 할 수 있다는 것을 프로그래머라면 다들 알 것이다. 프로세스 보다 작은 작업 스케쥴러임을..

생성 방법은 자바랑 별 차이가 없다.

class Thread extends Thread{
     public void run(){
     }
}
라는 클래스를 만들어 주고 그냥 돌리면 된다. 하나 차이가 있다면 setDaemon 을 이용하여 백그라운드에서 데몬처럼 이용하는지를 지정 할 수 있다.

다른 방법으로도 동일한게 있다. 바로 Runable을 확장해서 사용하는 방법이다.

class Thread implements Runable{
     public void run(){
     }
}

여기까지는 자바를 해 본 사람들이라면 다들 알 것이라 생각한다.

하지만 어떤 컴포넌트에 접근해서 쓰레드 안에서 접근하려면 오류가 난다. 이는 크로스 쓰레드 문제라는 것을 다들 알 것이다.

이를 해결하려면 자바에서 이용했던 핸들러 객체를 이용하면 된다.

Handler handler = new Handler(){
   public void handleMessage(Message msg){
   }
}

메세지를 구분하려면 msg.what 을 이용하면 된다.

위와 같이 구현 한 후 호출하는 부분에서 sendEmptyMessage와 같이 이용해서 접근 해야한다. C#에서 친다면 대리자를 이용한 Invoke 를 이용한 것이다.

또 다른 방법으로는 post를 이용하는 방법이다. 사용 방법은 아래와 같다. 단 핸들러 객체는 반드시 생성 해 둬야한다.

handler.post(new Runable(){
   public run(){
    }
});

핸들러로 메세지 전달하는 방법에도 안드로이드는 좀 신기 한 듯 하다.

Message 객체를 생성해서 obtain을 이용해서 넣을 수 있다.

Message msg = Message.obtain();
msg.what = value
msg.arg1 = value
처럼 한 후 sendMessage를 이용하여 핸들러에 전달한다. 여기서 arg1은 하나의 값, 하나를 더 보내자면 arg2를 해서 전달하면 된다.
다른 인자 값으로는 핸들러, what, arg1, arg2, obj 가 들어가는데 이들 형식은 핸들러를 제외하고 3개는 int 마지막 하나는 obj 타입이다.
그리고 recycle 메서드가 있는데 이놈은 다시 한번 메세지 풀에 다시 집어 넣는다. 하지만 이후 접근해서는 안된다.

또한 루퍼(Looper) 라는 것이 있다. 루퍼는 메세지를 전달 해 주는 역할을 한다.

prepare()를 이용하여 루퍼를 준비하고 loop()를 이용하여 실행한다. 이는 quit()가 실행 될 때 까지 작업을 한다.

루퍼를 구현하는 함수는 다음과 같다.

Thread getThread() - 현재 연결된 스레드 가져옴

static Looper getMainLooper() - 메인 스레드 루퍼 구현

static Looper myLooper() - 현재 스레드의 루퍼 구현

또한 스케쥴링에 의한 제어도 가능하다. 모두 어떤 프로세스를 실행 했을 때 어느정도 딜레이가 되거나 데이터가 제때 완료되어 나오지 않음을 경험 한 적이 있을 것이다.

안드로이드는 쓰레드 클래스를 이용 할 때와 Runable 이용하여 작업 시 각기 메세지를 보낼 절대 시간을 지정하거나 딜레이를 가지고 전달하는 방법이 있다.

쓰레드 클레스 경우 - sendMessageAtTime(Message,long)와 sendMessageDelayed(Message,long)

Runable 경우 - postAtTime(Runable, long)와 poatDelayed(Runable,long)

위와 같이 핸들러에 연결하여 이용하면 된다. 또한 핸들러를 직접 만들지 않고 컴포넌트 상에서도 접근하여 이용 할 수가 있다.

좀 더 효율 적으로 하기 위해 AsyncTask(1.5버전에서 제공) 하는데 솔직히 필자로 봣을 때는 (안드로이드 프로그래머가 아니라..) 그런 상황이 오면 이용을 할 만하겠다 싶긴하지만 필요성을 못 느끼고 있다..(고수님들이 보시면 설명 좀 해주시면 감사하겠습니다.)
[C#] Thread 동기화 C# 2012. 2. 3. 11:26
thread 에서 동기화가 중요하다는 것은 모두가 아는 사실이다.

하지만 방법상에 문제가 생길 수가 있다.

lock을 예로 들면

lock(this){동기화 코드} 형식으로 많이 쓰지만

그 작업 대상이 static으로 정적으로 되어 있을 경우에는

typeof(클래스명) 처리를 해서 해야한다.

그렇지 않을 경우 문제가 생김을 확인 할 수 있을 것이다.
[C#]스레드 C# 2009. 1. 14. 10:47
스레드 생성에는 Thread,ThreadPool,Timer Class를 이용한 세가지 방법이 존재한다.

여기서 Thread Class를 이용한 스레드는 과도한 문맥전환의 문제가 있을 수 있다.

이에 ThreadPool Class는 Pool을 구성하고 적정량의 스레드를 수용함으로

Thread Class를 이용한 것보다 좀 더 안정적이다.

Timer Class의 경우는 일정 시간마다 스레드를 자동으로 활성화 해 준다.

1.Thread Class

Thread th = new Thread(new ThreadStart(대상));

2. ThreadPool Class

ThreadPool.QueueUserWorkItem(new WaitCallBack(대상,null);

3. Timer Class

Timer timer = new Timer(new TimerCallBack(대상),null,시간,100);