언어(Programming Language)/Java

[Java] Thread 클래스와 Runnable 인터페이스 개념 및 사용법

RyanSin 2021. 1. 28. 15:46
반응형
package Access;

//사람 스래드
public class Person extends Thread {

     @Override
     public void run() {
          for (int i=0; i< 10; i++){
               System.out.println("Sub Thread 일 시작: "+ i);
          }
     }
}

- 지난 시간

안녕하세요. 지난 시간에는 자바 인터페이스(Interface)에 대해 알아봤습니다.

 

놓치고 오신 분들은 아래 링크를 통해 꼭~ 보고 오세요~! 설명할 개념에 인터페이스가 나옵니다!.

any-ting.tistory.com/33

 

[Java] 인터페이스(Interface)

- 지난 시간 안녕하세요. 지난 시간에는 자바 오버 로딩(Oberloading)과 오버 라이딩(Overriding)에 대해 알아봤습니다. 혹시 놓치신 분들은 아래 링크를 통해 상속에 대한 개념을 학습하고 오시는 걸

any-ting.tistory.com

- 개요

이번 시간에는 자바에 Thread와 Runnable에 대해 알아보겠습니다.

 

Thread와 Runnable이란 무엇일까요?

 

소프트웨어와 하드웨어에서 우리는 어떤 이벤트가 발생하면 그 이벤트에 맞게 여러 동작들이 일어납니다.

 

여기서 동작은 하나의 프로세스(Process)라고 합니다. 그리고 프로세스 안에는 스레드(Thread)가 있습니다.  프로세스와 쓰레드는 독립적으로 동작을 합니다.

작업자들은 같이 협력해서 일을 하지만 사실 여기서 동작은 각각 따로 움직입니다.(독립적!)

그리고 수에 따라 멀티 스레드 또는 싱글 스레드라고 표현합니다.(프로세스도 동일합니다. :>)

 

우리는 이때까지 싱글 스레드로 자바를 실행했습니다. 그리고 독립적으로 혼자서 일을 열심히 했죠...

 

스레드를 하나를 만든다는 건 일할 수 있는 일꾼을 하나 더 만들었다고 생각할 수 있습니다. 그럼 한번 만들어 볼까요?

 

- 사용법

Thread를 만드는건 어렵지 않습니다. 

 

Thread는 Class 입니다. extends로 상속을 받아 사용할 수 있습니다.

//사람 스래드
public class Person extends Thread {

     @Override
     public void run() {
          for (int i=0; i< 10; i++){
               System.out.println("Sub Thread 일 시작: "+ i);
          }
     }
}

//메인 클래스
public class Main {

    public static void main(String[] args) {

        //Thread 생성
        Person person = new Person();
        //Thread 실행
        person.start();
        
    }
}

//실행 결과 콘솔화면
Sub Thread 일 시작: 0
Sub Thread 일 시작: 1
Sub Thread 일 시작: 2
Sub Thread 일 시작: 3
Sub Thread 일 시작: 4
Sub Thread 일 시작: 5
Sub Thread 일 시작: 6
Sub Thread 일 시작: 7
Sub Thread 일 시작: 8
Sub Thread 일 시작: 9

위 코드를 보시는 것 처럼 Thread 클래스를 상속받고 오버라이드 메스드인 run() 메서드를 선언한 후 반복문을 만들어 줬습니다.

 

아까 위에서 Thread는 하나의 작업자라고 생각할 수 있다고 말했습니다. 

 

작업자가 일을 하는 곳은 run()메서드 입니다. 여기서 하나 중요한 부분이 있습니다. 오버라이드 메서드입니다.

 

위 이미지를 확인하면  Thread는 클래스는 사실상 Runnable 인터페이스를 implements 하고 있습니다.

 

그리고 Runnable 인터페이스 안에는 run() 메서드가 있습니다.

 

결국엔 Thread를 사용하기 위해서는 Runnable 인터페이스 메서드가 필요합니다.

 

독립적인 실행

//사람 스래드
public class Person extends Thread {

     @Override
     public void run() {
          for (int i=0; i< 10; i++){
               System.out.println("Sub Thread 일 시작: "+ i);
          }
          System.out.println("저... 아직이요!!");
     }
}

public class Main {

    public static void main(String[] args) {

        //Thread 생성
        Person person = new Person();
        //Thread 실행
        person.start();

        for (int i=0; i< 10; i++){
            System.out.println("Main Thread 일 시작: "+ i);
        }

        System.out.println("모든 작업자 작업 종료~! 퇴근하자~!!");
    }
}

 

위 코드를 실행하면 독립적이라는 말을 이해 하시게 됩니다.

 

실행할 때마다 결과 값이 다르죠?...ㅋㅋ 네 맞아요 정말 독립적으로 일을 하기 때문에 스레드는 컨트롤하기가 까다롭습니다...

 

Join() 

Thread Join 메서드는 해당 스레드가 모든 일을 끝낼 동안 다른 스래드가 기다려줍니다. 바로 한번 확인해보시죠!!

 

package Access;

public class Main {

    public static void main(String[] args) {

        //Thread 생성
        Person person = new Person();
        //Thread 실행
        person.start();

        try {
            //Join 실행!!
            person.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for (int i=0; i< 10; i++){
            System.out.println("Main Thread 일 시작: "+ i);
        }

        System.out.println("모든 작업자 작업 종료~! 퇴근하자~!!");
    }
}

join() 메서드를 사용했습니다. 사용하기 전과 결과가 다르죠! :)

 

 

우리는 이제 하나의 스레드를 만들어서 사용할 수 있게 됐습니다. 실습은 꼭~ 해보세요. :) 감사합니다!!