#### Thread ####

  - 생각보다 Thread 범위가 광범위하다. 너무 많다. 일단 오늘 배운 것( Runnable & extends ) 두 가지를 포스팅!

 

### Extends Thread ###

    * Thread 를 extends 한 클래스를 작성한다.
    * run() 메소드를 오버라이딩하여 내용부를 삭정한다.
    * main() 메소드를 내부에서 Thread 를 extends 한 클래스의 객체를 생성한다.
    * 해당 객체의 start() 메서드를 호출
    EX)
    class Daniel1 extends Thread {
       public void run() {
           System.out.println("Thread Start");
           for ( int i = 0; i < 10; i++ ) {
               System.out.println(i);
           }
       }
    }

    public class Daniel1Main {
        public static void main(String args[] ) {
            Daniel1 danile1 = new Daniel1();
            adniel1.start();
            System.out.println("Thread End")
        }
    }

 

### Runnable Thread ###
    * Runnable 을 구현하는 클래스 작성
    * run() 메서드를 오버라이딩하여 내용을 구현
    * main() 메서드에서 Runnable 를 구현한 클래스의 객체를 생성
    * Thread 객체를 생성하여 매개변수를 implements Runnable 한 객체를 대입
    * Thread 객체의 start() 메서드 호출
    EX)
    class Ssung1 implements Runnable {
        public void run() {
            System.out.println("Thread Start");
            for ( int i = 0; i < 10; i++ ){
                System.out.println(i);
            }
        }
    }

    public class Ssung1Main {
        public void run() {
            Ssung1 ssung1 = new Ssung1();
            Thread ssung1Thd = new Thread(ssung1);
            ssung1Thd.start();
        }
    }

 

    - 허접하다. 쩝



 - 2015.02.06 Thread 추가


▶ Thread 우선순위

- 동시에 여러 Thread 를 실행할 때 우선순위를 주어 실행시간을 늘려줄수 있다.

  우선순위라고 해서 숫자가 낮은게 먼저라고 생각하겟지만, 그 반대이다.

  쉽게, 실행시간을 늘려주기 위한 숫자라고 생각하면 될 듯 하다.

  우선순위는 1 ~ 10 까지 정수이며, Default 값은 '5' 이다.

  ThreadGroup 으로 상위 그룹의 우선순위를 설정한 후에 하위에 쓰레드를 추가하면 상위 ThreadGroup 에 설정한 우선순위를

  따라간다.

  그리고, Thread start() 하기전에 우선순위를 주어야 하며, start() 한 후에 우선순위를 주면 에러가 난다.

  방법은, Thread.setPriority(int 우선순위 값) 안에 1 ~ 10 까지의 값을 넣어주면 된다.


▶ Daemon Thread (데몬 쓰레드)

- 데몬 쓰레드는 일반쓰레드의 작업을 돕는 보조적인 쓰레드

  일반 쓰레드가 종료되면 자동으로 데몬 쓰레드는 종료가 된다.

  무한루프나, 조건문을 이용해서 데몬 쓰레드 실행 후 대기하고 있다가 조건이 맞으면, 작업을 수행하고 다시 대기하는 쓰레드

  데몬 쓰레드 작성 & 실행 방법은 일반 쓰레드와 거의 동일하다.

  쓰레드 start() 전에 setDaemon(boolean on) 값에 'true' 지정하면 데몬 쓰레드가 된다.

  주의할 점은 우선순위 설정과 같이 start() 하기전에 setDaemon(boolean on) 값을 입력하어야 한다.


- ex


public class Thread_Ex11 implements Runnable {


    // 자동저장

    static boolean autoSave = false;


    public static void main(String[] args) {


        Thread thread = new Thread(new Thread_Ex11());

        thread.setDaemon(true);

        thread.start();


        for (int i = 1; i < 20; i++) {

            try {

                thread.sleep(1000);

            } catch (Exception e) { }

            System.out.println(i);


            if( i == 5 ) {

                autoSave = true;

            }

        }

        System.out.println("프로그램을 종료합니다.");

    }


    @Override

    public void run() {

        while (true) {

            try {

                Thread.sleep(3 * 1000);     // 3초

            } catch (Exception e) { }


            // true 이면

            if (autoSave) {

                autoSave();

            }

        }

    }


    public void autoSave() {

        System.out.println("작업파일이 자동저장 되었습니다.");

    }

}


- main() 메서드 for 문이 종료되면 데몬 쓰레드는 자동으로 종료가 된다.
  하지만, 데몬쓰레드 설정 setDaemon(boolean on) 값에 'true' 설정을 하지 않고 그냥 보통 쓰레드로 위 구문을 실행하면,
  종료되지 않고.. 계속 "작업파일이 자동저장 되었습니다" 를 출력하게 될 것이다.(무한반복 '- ';;)


▶ 쓰레드 상태(JDK 1.5 부터 추가 됨)
- Thread.getState() 메서드 호출해서 확인 할 수 있다.

 STATUS

 COMMENT 

 NEW

 쓰레드가 생성되고 아직 START() 가 호출되지 않은 상태 

 RUNNABLE

 실행 중 또는 실행 가능한 상태 

 BLOCKED

 동기화블럭에 의해서 일시정지된 상태(LOCK 이 풀릴 때 까지 기다리는 상태)

 WAITING

 TIMED_WAITING

 쓰레드의 작업이 종료되지는 않았지만 실행가능하지 않은 일지정지 상태.

 TIMED_WAITING 은 일시정지시간이 지정된 경우를 의미 

 TERMINATED

 쓰레드의 작업이 종료된 상태





... 나중에 보면 또 다 까져먹을거 같은데..


 

   

'공부 > JAVA' 카테고리의 다른 글

JAVA_[날짜 형식 변경(SimpleDateFormat)]  (0) 2012.11.12
JAVA_[Vector]  (0) 2012.07.31
JAVA_[객체_직렬화]  (0) 2012.06.23
JAVA_[Adapter_패턴 (일명 : Wrapper 패턴)]  (0) 2012.06.23
JAVA_[Eclipse_SerialVersionUID]  (0) 2012.06.23

+ Recent posts