본문 바로가기

JAVA

쓰레드(1) - 쓰레드의 사용법 및 정의

1. 쓰레드란 무엇인가?


우리가 만드는 보통의 클래스들은 모두 단일 쓰레드에서 동작하는 것이다.

즉 java라는 명령어를 실행해서 결과물을 출력하고 끝내는 프로그램인 것이다.

 

하지만 JAVA 개발자로 프로그램을 개발하게 되다보면 이러한 프로그램을 만들지 않는다.

 

우리가 작성하는 일반적인 자바 클래스를 실행하게 되면 자바 프로세스가 시작되고, main() 메소드가 수행하면서 하나의 쓰레드가 시작 되는것이다. 

 

이렇게 JVM이 시작되면 자바 프로세스가 시작한다. 시작한 하나의 프로세스 안에서 여러개의 쓰레드가 수행된다.

 

 

2. 쓰레드를 생성해보자


쓰레드를 생성하는 방법에는 크게 두가지가 있다.

Runnable 인터페이스를 구현하는 것과 Thread 메소드를 상속받는 것이다.

자신이 쓰레드를 생성할 클래스가 상속을 받고 있다면 다중상속이 불가능 하므로 Runnable 인터페이스를 구현하고,

그렇지않다면 Thread를 Overriding 하는 방법이 있다.

 

public class RunnableSample implements Runnable{
    @Override
    public void run() {
        System.out.println("Runnable Sample 의 run 메소드");
    }
}

public class ThreadSample extends Thread{
    @Override
    public void run() {
        System.out.println("ThreadSample의 run 메소드");
    }
}

public class RunMultiThreads {
    public static void main(String[] args) {
        RunMultiThreads rm = new RunMultiThreads();
        rm.RunThreads();
    }

    public void RunThreads(){
        RunnableSample []rs = new RunnableSample[5];
        ThreadSample []ts = new ThreadSample[5];

        for (int i = 0; i < 5; i++) {
            rs[i]= new RunnableSample();
            ts[i]=new ThreadSample();

            new Thread(rs[i]).start();
            ts[i].start();
        }

        System.out.println("RunThreads() 메소드 종료");
    }
}

Runnable 인터페이스를 구현하는 클래스와 Thread 클래스를 상속받는 클래스를 생성하였다.

이 두개의 쓰레드 클래스를 실행하는 방식은 RunmultiThread의 RunThreads 메소드를 보면 알 수 있다.

 

main 메소드를 실행시켜 보면 기존에 작성했던 코드들과는 다르게 실행되는것을 볼 수 있다. main 메소드를 두번 컴파일 해보자.

첫번째
두번째

순서가 뒤죽박죽 출력되는 것을 볼 수 있다. 이처럼 쓰레드를 구현할 때 start() 메소드를 호출하면 쓰레드 클래스에 있는 run() 메소드 내용이 끝나던 안 끝나던 간에 바로 다음 줄에 있는 코드를 실행한다.

메소드가 실행되면 JVM 내부의 heap영역에 쓰레드가 올라가게 되는데 이는 순서에 상관없이 실행된다.

JVM의 구조와 자바의 메모리 구조

 

JVM의 구조와 자바의 메모리 구조

자바 애플리케이션이 실행될 때 JVM에서 일어나는 일, 과정은 어떻게 될까? 우리가 자바 애플리케이션을 실행할 때 JAVA와 OS 사이에서 동작하는 JVM(Java Virtual Machine)이라는 소프트웨어로 구현한 머

dev-cool.tistory.com

 

즉, 객체에 있는 메소드를 쓰레드에 담아 JVM에서 실행하게 되면 종료순서는 알 수 없다.