본문 바로가기

Java Programming

Multi-Threading ③ Thread Objects

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
<스레드의 정의와 시작>

일단 멀티 스레드로 작업을 하기 위해서는 Runnable 이라는 인터페이스를 구현(implements)하거나 Thread 클래스를 상속(extends)받는 두가지의 방법이 있습니다. 다시 말하면, run() 이라는 메소드가 있어야 하기 때문인데, Thread 클래스는 Runnable을 구현하고 있기 때문에 결국은 Runnable 인터페이스를 구현하는 셈이 되는거죠.

/*
* Runnable
인터페이스를 구현하는 경우
*/

public class HelloRunnable implements Runnable {

      public void run() {

            System.out.println("Hello from a thread!");

      }

      public static void main(String args[]) {

            (new Thread(new HelloRunnable())).start();

      }

}

/*
* Thread
클래스를 상속 받는 경우
*/

public class HelloThread extends Thread {

      public void run() {

            System.out.println("Hello from a thread!");

      }

      public static void main(String args[]) {

            (new HelloThread()).start();

      }

}

어떤게 더 좋은 방법인지는 잘 모르겠습니다만, 굳이 두가지 방법중에 하나를 선택하라고 한다면, 상속을 받는 쪽보다는 구현을 하는 쪽을 선택하겠습니다. 상속이라는 것에는 제약이 너무 많기 때문입니다 ^^; (횡설수설..)



스레드를 실행 시키는 절차


① Runnable 객체(스레드에서 할 작업) 생성
  
   Runnable threadJob = new MyRunnable();


② Thread 객체를 만들고 생성자에 Runnable 객체를 전달합니다.

   Thread myThread = new Thread(threadJob);

③ Thread 객체를 시작시킵니다.

   myThread.start();
여기서 중요한건 스레드에 수행할 작업을 생성자의 매개변수로 꼭 주어야 하며, 스레드 객체의 start() 메소드를 사용하여 스레드를 시작 시켜야 한다는 겁니다. start() 메소드를 실행하지 않거나, 매개변수로 작업을 주지 않으면 아무것도 안하는 스레드가 만들어 지는것이기 때문에 의미가 없습니다!!



스레드를 잠깐 재우는(중단시키는) 방법도 있습니다 메소드명은 sleep(long millis) 이고 스태틱 메소드 입니다. 밀리초(1/1000초)단위 입니다. sleep(3000) 이라고 쓰면 3초동안 멈추었다가 실행하겠죠 -ㅅ-??

또한 sleep 메소드는 InterruptedException를 발생 시키기 때문에 아래와 같이 사용을 해야합니다 ^^


public class SleepMessages {

      public static void main(String args[]) {

            String importantInfo[] = { "잇힝", "유후", "즐거운 자바", "하악하악" };

            for (int i = 0; i < importantInfo.length; i++) {

                   // 4초간 대기합니다

                   try {

                          Thread.sleep(4000);

                   } catch (InterruptedException e) {

                          // 예외 발생되면 메세지를 출력합니다.

                          e.printStackTrace();

                   }

                   // 메세지를 출력합니다.

                   System.out.println(importantInfo[i]);

            }

      }

}