Java Thread

Java 2009. 5. 25. 12:17
□ Thread
   - 현재 실행중인 Application 내부에 독립된 하나의 process를 생성하여 Multi Processing을 가능하게 해주는 객체
   - class가 Thread 객체를 상속받거나 Runnable Interface를 implements 받아 run 함수를 구현해주면 되는데 
      Card 객체를 이미 상속받고 있으므로 Runnable Interface를 implements 받으면 된다.
○ Thread의 중요 함수
   1. Thread.sleep(int sleepTime)
      - Thread에  Delay를 주는 매우 중요한 함수이다.
      - sleep Time은 Application의 속도를 단말기의 상이한 성능에도 동일한 속도를 줄 수 있다.
      - sleep Time의 중요한 역할은 Application의 속도 조절 외에도 느린 하드웨어에 따른 오류를 방지하는 역할도 수행
   2. Thread.yield()
      - Thread가 가동이 되면 Thread가 메모리를 장악하게 된다.
      - 이 때, 다른 Thread의 메모리 접근을 차단시켜 VM이 제대로 활동할 수 없게 될 수도 있다.
        따라서 Thread가 장악하고 있는 메모리를 다른 Thread도 접근이 가능 하도록 메모리를 양보해 주는 것이 좋다.
○ Thread 사용
   1. System Thread
      - VM에서 기본적으로 2가지 Thread를 운영한다.
      - 예외 상황 감시 Thread : 저 전압, 전화, sms등 단말기 시스템의 예외 상황을 감시하는 Thread
      - 하드웨어 통신 Thread :
         VM에서 하드웨어에게 메시지를 전달하거나 하드웨어가 VM에게 메시지를 전달할 경우 이를 감지하기 위한 목적
      - SKVM에서 사용한 이벤트 큐 감시 Thread는 리스너로 대체 되었다.
   2. User Thread
      - 많은 Thread를 운영하게 되면 시스템에 과중한 부하를 줄 수 있다.
      - Main Thread : Application을 운영하기 위해 운영하는 Thread
      - 네트워크 관리 Thread : 
         대부분 단발성 Thread로 운영. 네트워크 통신 동안에는 Blocking이 걸리게 되어 네트워크 관련된 작업은 별도의
         Thread로 운영한다.
○ Thread 사용 방법
   1. Thread를 사용하기 위해서 Runnale를 implements 하기
      public class ThreadCard extends Card implements Runnable {
   2. Thread 클래스 선언
      Thread t;
   3. 생성자에 Thread객체 생성하고 start()해주기
      t = new Thread(this);   // 어떤 메소드를 Thread 시켜줄지 지정해줘야 함
      t.start();                      // 여기서는 class내의 run() method, run()은 따로 독립적으로 돌림
   4. Thread run() Method 선언
      public void run() {
         try {
            Thread.yield();
         } catch( Exception e ) { }
         while(true) {
            try {
            } catch( Exception e ) { }
         }
      }



□ Timer
   - Runnable Interface 상속받은 class
   - Runnable Interface의 기능을 강화하여 만든 class
   - 별도의 class를 생성하여 사용
   - TimerTask 객체 내부의 run 함수를 구현하여 Timer.scheldule 함수를 이용해 수행 시킨다.
   - TimerTask의 run 함수는 Timer.schedule() 함수 호출시 자동 호출 되며 그 후에는 이벤트가 발생했을때 호출된다.
   - Timer를 종료하고 싶을 때는 Timer.cancel()함수를 사용하면 된다.
   - 무한으로 반복하는 것이 아니라 주기적으로 실행할때 사용한다.
   - Timer.schedule()를 사용하여 주기적으로 작업을 실행시키고 Timer.cancel()를 사용하여 중지한다.
○ 사용방법
   1. TimerTask class를 사용하기 위해 import java.util.*;
   2. TimerTask 상속받기 public class T_T extends TimerTask
   3. Card객체 생성 TimerCard card;
   4. 카드안에 존재하는 멤버를 모두 사용하기 위해서 카드객체 생성
      public T_T(TimerCard card) {
         this.card = card;    // 자기의 주소값을 넘겨줌
      }
   5. Thread를 사용하기 위한 run() Method 구현
      ....
      card.display.flush();
      // paint() mathod가 끝나야지만 Back-Buffer내용을 갱신할 수가 있는데
      // 수동으로 설정하는 방법 : flush()를 사용해서 내부의 버퍼의 내용을 화면에 출력 하기도 한다.



□ Thread와 Timer의 차이점
○ Thread는
   1. Runnable를 구현
   2. run() Mathod를 구현
   3. start() Method로 시작
○ TimerTask
   1. TimerTask를 상속
   2. run() Method를 구현
   3. Timer.schedule()로 실행
   4. Timer.cancle()로 중지
○ CallSerially
   - callSerially 함수는 Display 객체 내에 구현되어 있으며 인수로 Thread 객체를 받는다.
   - callSerially() Method 호출시 자동으로 Thread 객체가 생성이 되며 생성자 종료시, 
     또는 드로잉 이벤트 발생시 run 함수가 자동 호출된다.
   - callSerially() 사용할때 주의할점 : 한번만 run() Method를 호출하기 때문에 화면갱신을 완벽하게 만들어야 
                                                    Thread가 멈추지 않음

posted by 느릅나무™