Programming/JAVA

[JAVA] 쓰레드 (Thread), Runnable 인터페이스

잇나우 2020. 3. 15. 14:27
반응형

쓰레드 (Thread)

쓰레드를 알기 위해선 먼저 프로세스(process)에 대해 알아야한다. 프로세스란 쉽게 말해 실행되고 있는 프로그램이다. 그렇다면 쓰레드란 무엇일까? 쓰레드란 프로세스 내에서 실행되는 작업 단위를 말한다. 프로그램은 코드를 작성한대로 순차적으로 실행이 되는데 이 쓰레드를 이용하면 동시의 여러개의 코드를 실행할 수 있다. 여러 쓰레드를 이용하여 프로그램을 동시에 여러 동작으로 실행시키는것을 멀티쓰레딩이라고 한다.

멀티 쓰레딩 예제 (Thread 클래스 상속)

public class ThreadTest extends Thread{
    String name;
    int num;
    public ThreadTest(String name, int num) {
        // TODO Auto-generated constructor stub
        this.name = name;
        this.num = num;
    }    
    @Override
    public void run() {
        for(int i=1; i<=num; i++) {
            System.out.println(name+"=>"+i);
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ThreadTest ex1 = new ThreadTest("1번 스레드", 100);
        ThreadTest ex2 = new ThreadTest("2번 스레드", 100);
        ThreadTest ex3 = new ThreadTest("3번 스레드", 100);

        ex1.start(); // run 메소드 호출
        ex2.start(); // run 메소드 호출
        ex3.start(); // run 메소드 호출
    }
}

위 코드는 ThreadTest라는 클래스가 Thread 클래스를 상속했다. Thread 클래스의 run()를 상속하고 메소드안에는 몇번째 쓰레드인지 출력이 되게 변수를 이용하여 출력하게 끔 코드가 작성되어있다. ThreadTest의 객체를 생성후 start() 이용해 run메소드를 출력을 하는 코드이다. (Thread 클래스를 상속했기때문에 start() 실행시 run()가 실행된다.) 결과는 1번 스레드가 1~100까지 출력된후 2번 쓰레드가 실행되고, 이러한 차례차례 순차적인 실행이 아닌 랜덤하게 2번 쓰레드가 먼저 시작되거나 3번 쓰레드 가 랜덤한 반복횟수를 실행훈 다른 쓰레드가 실행되는것을 알 수 있다.
쓰레드는 굉장히 짧은시간동안 각 쓰레드마다 실행되어 마치 사람이 느끼기에는 동시에 일을 처리하는 것처럼 보인다. 일정시간동안 하나의 쓰레드가 실행된후 다른 쓰레드가 일정시간동안 실행, 또 다른 쓰레드가 일정시간 동안 실행.. 이런식으로 계속 서로서로 번갈아가면서 실행이 된다. 그 일정시간이 굉장히 짧은 시간이기때문에 동시에 여러 코드의 프로세스가 실행 되는 것이다.(동시에 실행되는것처럼 느껴지는것)

Runnable 인터페이스

쓰레드를 사용할때 Thread 클래스를 상속하는 방법도 있지만, 상속이 불가능할 경우엔 Runnable 인터페이스를 구현하는 방법이 있다.

public class RunnableTest implements Runnable{
    String name;
    int num;
    public RunnableTest(String name, int num) {
        // TODO Auto-generated constructor stub
        this.name = name;
        this.num = num;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        for(int i=1; i<=num; i++) {
            System.out.println(name+"=>"+i);
        }    
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        RunnableTest ex1 = new RunnableTest("1번스레드", 100);
        RunnableTest ex2 = new RunnableTest("2번스레드", 100);
        RunnableTest ex3 = new RunnableTest("3번스레드", 100);
        // 다시 스레드로 만들어 줘야 한다.
        Thread th1 = new Thread(ex1);
        Thread th2 = new Thread(ex2);
        Thread th3 = new Thread(ex3);
        // run 메소드 호출    
        th1.start();
        th2.start();
        th3.start();
    }
}

Thread 클래스를 상속할때와 크게 차이는 안나지만 가장 큰 차이는 start()를 실행할때 Runnable 인터페이스를 구현한 객체로 실행하는것이 아니라 그 객체를 이용하여 다시 쓰레드의 객체를 만들어서 실행 해야한다는 점이다.

반응형

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

JVM이란?  (0) 2020.12.21
[JAVA] Arrays.asList()  (0) 2020.09.17
[JAVA] 접근 지정자, Final 기본적인 개념  (0) 2020.03.02
[JAVA] 기본적인 enum  (0) 2020.02.25
[JAVA] 인터페이스 (Interface)  (0) 2020.02.24