쓰레드 생성과 동기화 오롯이 |
자바와 닷넷에서의 쓰레드 모델을 살펴보자

자바의 경우,

쓰레드 생성은...
java.lang.Thead를 상속받아 클래스를 정의하거나 java.lang.Runnable을 구현하는 클래스를 정의하며 클래스내에는 public void run() {} 메소드가 정의되어야 한다. 명시적으로 클래스를 만들지 않고 anonymous class 형태로 쓰레드를 생성할 수 있다.
new Thread() { public void run() { ………… } }.start(); 

혹은
new Thread(new Runnable() { public void run() { ……………} }).start();
로 쓰레드를 생성하고 바로 실행시킨다.

쓰레드 동기화는...
synchronized라는 키워드가 존재하여 쓰레드 간 동기화 작업을 지원한다. 사용방법은 원하는 블록을 지정하여 synchronized로 지정할 수도 있고, 메소드의 modifier로 사용되어 메소드 전체에 대해 flag 방식으로 지정되어 좀 더 효율적인 방법을 제공하고 있다.(j2se 1.4 기준) Lock으로는 객체lock과 클래스lock을 지원하며, 객체lock의 경우 synchronized(this) {} 와 같이 지정하고 이 경우 호출되는 객체가 객체lock으로 지정되며, 원하는 객체를 lock으로 지정할 수도 있다. synchronized(youTheObject) {}와 같이 사용한다.
클래스lock의 경우 synchronized(MyClass.class) {} 와 같이 지정하거나, static 메소드의 modifier로 synchronized가 사용된 경우로서, 이 경우 MyClass.class를 지칭하는 java.lang.Class.class 객체의 인스턴스가 클래스lock으로 지정된다. 클래스를 지칭하는 Class 인스턴스는 JVM내에 유일하게 관리된다.
객체lock과 클래스lock은 동시에 사용가능하다. 즉, 객체lock을 필요로 하는 메소드와 클래스lock을 필요로하는 메소드는 동시에 두 쓰레드로부터 호출될 수 있다. (이점이 닷넷과 다르다 !!!)
최근에 j2se 5.0 부터 concurrent programming을 지원하기 위해 java.util.concurrent.* 가 추가되었다. 이는 자바 concurrent 프로그래밍의 대가인 Doug Lea의 작업 산출물이 추가된 것으로 보인다.
 

닷넷의 경우,

쓰레드 생성은…
쓰레드 풀과 delegate을 써서 이루어지는데, System.Threading.ThreadPool.QueueUserWorkItem 메소드를 통해 이루어지며 파라미터로 원하는 메소드의 delegate을 넘겨줌으로써 쓰레드 방식으로 동작하게 된다. Thread pool manager는 넘겨받은 delegate을 queue에 쌓아놓고 가용한 쓰레드가 있을 경우 이를 할당하여 메소드를 실행시킨다.
닷넷 프레임웍에도 System.Threading.Thread라는 클래스가 있지만 sealed되어 개발자가 상속받을 수 없다. 하지만 직접 new 연산자를 써서 쓰레드를 생성할 수 있다. 이때 Thread의 contructor로 전달되는 파라미터는 실행을 원하는 메소드를 지칭하는 delegate이다. 즉,
new Thread(new ThreadStart(ThreadProc)).Start();     // ThreadStart는 delegate, ThreadProc은 메소드임
와 같이 실행시킨다. (상속을 제외하고 자바와 유사하다…..)

Thread.ThreadState property를 통해 상태를 알 수 있다.
New Thread() --> Unstarted 상태
Thread.Start() --> Running 상태 (OS의 ready list에 올리는 것일 뿐, 바로 실행되는 것은 아니다.)
Thread.Suspend() --> Suspended 상태.
Thread.Resume() --> Suspended에서 Running 상태로
Thread.Sleep() --> WaitSleepJoin 상태
Suspended 상태는 Thread.Resume()에 의해서만 깨어날 수 있으나,
WaitSleepJoin 상태는 지정한 시간이 경과하거나, lock을 잃어버리거나, Thread.Interrupt()가 호출되거나할 경우 깨어난다. System.Threading.ThreadInterruuptedException 처리가 요망된다. (자바와 같다.)
(자바에서는 Thread.stop(), Thread.suspend(), Thread.resume() 모두 deprecated되었는데, 이유는 이러한 것들이 쓰레드의 상태를 깨뜨릴 수 있는 불안전한 메소드들이기 때문이다.)

쓰레드 우선순위는 5개다 : Highest, AboveNormal, Normal, BelowNormal, Lowest  (자바는 1 ~10)
우선순위는 Thread.Priority property를 통해 알 수 있다.
Thread.Abort()를 통해 쓰레드를 종료시키는데, Abort가 호출되었다고 쓰레드가 종료되었다고 볼수 없다. Abort가 호출되면 ThreadAbortException이 발생하는데, 이 Exception은 특별하여 catch블럭 끝에서 자동적으로 다시 ThreadAbortException을 발생시킨다. Catch 블록 안에서 Thread.ResetAbort()를 호출하여 Abort()를 무력화 시킬수도 있기 때문에 Thread.Join()을 호출하여 정말 쓰레드가 죽었는지 확인해야 한다. Thread.Join()은 쓰레드가 죽기 전에는 리턴하지 않는 blocking call이다.

쓰레드 동기화는...
VB.NET의 경우 SyncLock이라는 키워드가 있고, C#에는 lock이라는 키워드가 있어서, 자바의 synchronized와 동일한 역할을 한다.
Lock 객체가 객체 레벨과 클래스 레벨과 분리되어 있는 것은 자바와 동일하나 내부적으로 자바와 같은 방식으로 관리하는지는 알 수 없다.(아직까지…^^)
닷네의 경우에는 자바 보다 다양한 방식으로 thread synchronization을 지원하는데
첫째, attribute 기반 thread synchronization은 System.Runtime.Remoting.Contexts.SynchronizationAttribute를 클래스 attribute로 지정하고 ContextBoundObject를 상속받아 클래스를 작성하면 된다. 이경우 해당 클래스의 모든 메소드에 접근할때마다 lock객체를 얻어야하는 오버헤드가 발생한다.
둘째, C#의 lock 키워드 (VB.NET의 SyncLock)를 사용하여 제공한다. 이 경우 원하는 메소드 내에 블록을 지정하여 해당 블록에서만 lock 객체를 얻도록 할 수 있다. 내부적으로 컴파일러가 System.Threading.Monitor 클래스를 통해 synchronization을 제공한다. Monitor.Enter… Monitor.Exit
셋째, System.Threading.Monitor 객체를 직접 코드에서 다루면서 synchronization을 제공할 수 있다.

닷넷에서 특이한 점은 일단 한 쓰레드에 의해 특정 클래스의 클래스lock이 얻어진 경우, 그 클래스의 모든 인스턴스에 대한 접근이 block된다. 즉, 클래스lock은 모든 객체lock을 잡지 못하도록 만든다. (정말 ?? 이점이 특히 자바와 다르다. !!!!)

자바와 닷넷에서 쓰레드 생성 코드를 비교하면 너무나 유사하다. 자바에는 Anonymous class라는 개념이 있는 반면, 닷넷에는 Anonymous Method 라는 개념이 있다.

* 자바의 경우

new Thread(new Runnable() {
  public void run()
  {
     System.out.println("babo");
  }
}).start();

* 닷넷의 경우

new Thread(delegate() {
   Console.WriteLine("babo");
}).Start();
Trackbacks (2) | Comments (1)
http://acroama.isblog.net/trackback_post_6.aspx
61a4b1676d9c 4/14/2008 8:38:56 AM
61a4b1676d9c
61a4b1676d9c71bb981a
http://k.hofgucemfi.com/ea 11/1/2008 9:17:18 PM
Heavenly Gorgeus Natural
P1Za2t0 | Clothing Olsen Sigrid
오롯이 11/21/2007 7:25:41 PM
C# 3.0에서 Anonymous Type 이라는 것이 추가되었는데, 자바의 Anonymous Class와 유사하다. C#의 Anonymous Type은 하나 이상의 public read-only Property만을 가진 클래스로 정의되며 다른 클래스와 관련없이 만들어지고 주로 Query Express에서 쓰인다. 이 점은, 자바의 Anonymous Class가 추상 클래스의 인스턴스를 만드는 방식으로 써서 추상 클래스를 상속 받은 이름없는 클래스를 만들거나, 인터페이스의 인스턴스를 만드는 방식으로 써서 해당 인터페이스를 구현한 이름없는 클래스를 만드는 것과는 확연히 다르다.
Reply Delete
name
password
homepage
comment
secret
< PREV 1 NEXT >