본문 바로가기

JAVA

Thread 시작, 종료 예제

Thread 시작, 종료 예제

 

  Java에서 사용하는 Thread는 간단하게 생각해서 하나의 흐름이라고 생각하면 될 것 같다. 하나의 프로세스에는 한 개 이상의 스레드를 사용할 수 있다. 여러 개의 스레드를(멀티 스레드) 사용할 수도 있다. 예를 들면 이클립스에서 잘못된 코딩을 한 경우 자동으로 오류를 지적해 주는데, 이것은 백그라운드에서 스레드가 계속 작동하기 때문이다.

 

Java는 기본적으로 c/c++과 달리 키워드로 동기화를 지원해 준다. 그래서 비교적 다른 언어와 달리 멀티 스레드를 쉽게 사용할 수 있다.

 

스레드는 상속을 통하여 구현할 수 있다. 스레드를 상속하면 run()메소드를 반드시 오버라이딩 해야  한다. 이 메소드에 비즈니스 로직이 들어간다.

 

간단하게 예제를 통하여 스레드의 상속과 시작, 종료에 대해 알아보자.

 

스레드의 상속


class ExtendThread extends Thread {

     public void run() {

           System.out.println("Thread 클래스를 상속");

 

     }

 

}

 

public class ExtendsThreadTest {

     public static void main(String[] args) {

           Thread t = new ExtendThread();

           t.start();

 

     }

}

 

<결과>

Thread 클래스를 상속

 

 

위 예제는 ExtendThread 클래스가 Thread클래스를 상속받아 run()메소드를 오버라이딩 하여ExtendsThreadTest에서 실행한 코드이다. Start()메소드를 이용하여 스레드를 시작 한다.

다음은 스레드의 종료에 대해 알아보자. 원래 스레드를 종료할때 stop()라는 메소드가 존재하지만, 여러 문제점으로 인해 현재는 사용하지 않는 것을 권고한다고 한다. 다음의 방법은 stop()메소드를 이용하지 않고, flag 와 interrupt()메소드를 사용한 예제이다.

class StopThread implements Runnable {

     private boolean stopped = false;

 

     public void run() {

           while (!stopped) {

                System.out.println("Thread is alive");

 

                try {

                     Thread.sleep(2000);

                } catch (InterruptedException e) {

                     e.printStackTrace();

                }

           }

           System.out.println("Thread is dead");

     }

 

     public void stop() {

           stopped = true;

     }

}

 

public class StopThreadTest {

     public static void main(String [] args){

           System.out.println("####START####");

           StopThreadTest test = new StopThreadTest();

           test.process();

     }

     public void process(){

           StopThread st = new StopThread();

           Thread thread = new Thread(st);

           thread.start();

          

           try{

                Thread.sleep(3000);

           }catch(InterruptedException e){

                e.printStackTrace();

           }

           st.stop();

     }

}

 

위 예제는 스레드가 실행되는 중간에 flag를 이용하여 종료하는 방법이다. Stop()메소드를 실행하면 flage true가 되면서 실행되고 있는 while문이 종료되고, 스레드는 종료한다.

 

class AdvancedStopThread implements Runnable {

     public void run() {

           try {

                while (!Thread.currentThread().isInterrupted()) {

                     System.out.println("Thread is alive");

                     Thread.sleep(500);

                }

           } catch (InterruptedException e) {

                //예상된 예외이므로 무시. 무시하지 않을경우 예외 발생.

           } finally {

                System.out.println("Thread is dead");

           }

     }

}

 

public class AdvancedStopThreadTest {

     public static void main(String[] args) {

           System.out.println("####START####");

           AdvancedStopThreadTest threadTest = new AdvancedStopThreadTest();

           threadTest.process();

     }

 

     public void process() {

           AdvancedStopThread ast = new AdvancedStopThread();

           Thread thread = new Thread(ast);

           thread.start();

 

           try {

                Thread.sleep(1000);

           } catch (InterruptedException e) {

                e.printStackTrace();

           }

           thread.interrupt();

     }

}

위 예제는 interrupt() 메소드를 이용하여 스레드를 종료시키는 예제이다. Interrupt()메소드는 하던 일을 멈추는 메소드이다. isInterrupted()메소드를 사용하여 멈추었을 경우 반복문을 나가서 스레드가 종료하게 된다.