twocowsong

스레드(Thread)와 Runnable 본문

IT/JAVA

스레드(Thread)와 Runnable

WsCode 2022. 5. 23. 18:05

프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말합니다. 

스레드는 프로세스내에서 실행되는 흐름의 단위를 말합니다.

일반적으로 한 프로그램은 하나의 스레드를 가지고있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행 할 수 있습니다. 이러한 방식을 멀티스레드라고 부릅니다.

 

자바에서는 스레드를 편하게 사용이가능합니다.

public class Test extends Thread{

   public static void main(String[] args) {
      Test sample = new Test();
      sample.start();
   }

   public void run() {
      System.out.println("RUN!!!!!");
   }

}

Test 클래스에서 Thread를 상속받았습니다.

Test클래스에서 start를 호출 시 run 메소드가 호출되며 위에 클래스의 결과값은 아래와 같습니다.

RUN!!!!!

Thread클래스를 상속받으면 start메소드 호출 시 run메소드가 실행됩니다.

위의 내용을 자세히보면 어떤 스레드가 어떻게 동작하는지 명확하지않습니다.

아래의 코드를 보면서 스레드의 동작을 확인해봅시다.

 

public class Test extends Thread{
   // 전역 변수 seq 생성
   int seq;
   
   // 생성자로 seq 변수를 초기화합니다.
   public Test(int seq) {
      this.seq = seq;
   }

   public static void main(String[] args) {
      // Thread를 10번 호출합니다.
      for (int i = 0; i < 10; i++) {
         // Test Class는 Thread를 상속받았으므로 Thread로 업캐스팅이 가능합니다.
         Thread t = new Test(i);
         // run 메소드를 실행합니다.
         t.start();
      }
      System.out.println("Main Class End");
   }

   public void run() {
      System.out.println(this.seq + " : Test Class run Method Start");
      try {
         Thread.sleep(1000);
      }
      catch (Exception e) {
      }
      System.out.println(this.seq + " : Test Class run Method End");
   }

}
Main Class End
1 : Test Class run Method Start
8 : Test Class run Method Start
7 : Test Class run Method Start
3 : Test Class run Method Start
9 : Test Class run Method Start
4 : Test Class run Method Start
5 : Test Class run Method Start
6 : Test Class run Method Start
2 : Test Class run Method Start
0 : Test Class run Method Start
7 : Test Class run Method End
4 : Test Class run Method End
6 : Test Class run Method End
2 : Test Class run Method End
3 : Test Class run Method End
1 : Test Class run Method End
8 : Test Class run Method End
0 : Test Class run Method End
9 : Test Class run Method End
5 : Test Class run Method End

스레드는 위의 결과처럼 순서에 상관없이 동시에 실행되며 Main문이 끝났음에도 스레드는 실행중인것이 확인됩니다.

(스레드가 종료때까지 대기하고싶다면 Thread.join문에 대하여 찾아보시면 됩니다.)

 

스레드를 사용할때는 보통 Runnable인터페이스를 구현하도록 하는 방법을 주로 사용합니다.

왜냐하면 Thread클래스를 상속하면 다른 클래스를 상속할수없어 제한이 되기때문입니다.

 

public class Test implements Runnable{
   // 전역 변수 seq 생성
   int seq;

   // 생성자로 seq 변수를 초기화합니다.
   public Test(int seq) {
      this.seq = seq;
   }

   public static void main(String[] args) {
      // Thread를 10번 호출합니다.
      for (int i = 0; i < 10; i++) {
         // Test Class는 Thread를 상속받았으므로 Thread로 캐스팅이 가능합니다.
         Thread t = new Thread(new Test(i));
         // run 메소드를 실행합니다.
         t.start();
      }
      System.out.println("Main Class End");
   }

   @Override
   public void run() {
      System.out.println(this.seq + " : Test Class run Method Start");
      try {
         Thread.sleep(1000);
      }
      catch (Exception e) {
      }
      System.out.println(this.seq + " : Test Class run Method End");
   }

}

Runnable를 implements하였습니다.

Runnable인터페이스는 Run메소드를 구현하도록 강제합니다.

Thread의 생성자로 Runnnable인터페이스를 구현한 객체를 넘길수 있는데 이방법을 사용하였습니다.

 

참고 사이트 ) https://wikidocs.net/230

'IT > JAVA' 카테고리의 다른 글

자바 람다식 - anyMatch  (0) 2022.04.05