철갑이의 이모저모

[java] 멀티 스레드 - (1) 작업 스레드 생성과 실행 본문

java

[java] 멀티 스레드 - (1) 작업 스레드 생성과 실행

철갑 2023. 7. 5. 00:26
728x90

1. 프로세스와 스레드

  • 프로세스(process) :  실행 중인 하나의 애플리케이션
  • 멀티 태스킹(multi tasking) : 두 가지 이상의 작업을 동시에 처리하는 것
  • 스레드(thread) : 프로세스 내에서 실제로 작업을 수행하는 주체로 작업을 실행하기 위한 코드 실행 흐름(하나의 스레드는 하나의 코드 실행 흐름)

2. 메인 스레드

자바 애플리케이션에서 메인 스레드는 main() 메소드를 실행하면서 시작된다. 메인 스레드는 필요에 따라 작업 스레드들을 만들어서 병렬로 코드를 실행한다. 싱글 스레드 애플리케이션은 메인 스레드가 종료되면 프로세스도 종료된다. 하지만 멀티 스레드는 실행 중인 스레드가 있다면 프로세스는 종료되지 않는다. 또한 메인 스레드가 먼저 종료되더라도 다른 스레드가 계속 실행 중이라면 프로세스는 종료되지 않는다.

< 예시코드 >

// 작업 스레드 코드

public class Task implements Runnable{
    public void run() {
        for (int i=0; i<5; i++) {
            System.out.println("작업스레드");
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
// 메인 스레드와 작업 스레드 동시 실행 코드

public class MainThread {
    public static void main(String[] args) {
        Thread thread = new Thread(new Task());
        thread.start();

        for(int i=0; i<5; i++) {
            System.out.println("메인스레드");
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

위와 같이 메인 스레드와 작업 스레드를 동시 실행했을때 메인 스레드가 먼저 종료됐음에도 작업스레드가 계속 진행이 되는 것을 확인할 수 있다.

3. 작업 스레드

3-1. Thread 클래스로 직접 생성하기

java.lang.Thread 클래스로부터 직접 스레드 객체를 생성하려면 Runnable을 매개값으로 갖는 생성자를 호출한다. 

Thread thread = new Thread(Runnable target);

Runnable 코드를 확인해보면 run() 메소드가 정의되어 있는 것을 볼 수 있다. 

Runnable Interface

Runnable은 인터페이스 타입이기 때문에 run()을 재정의해서 작업 스레드가 실행할 코드를 작성하면 된다.

public class task implements Runnable{
    public void run() {
    	// 스레드가 실행할 코드
    }

마지막으로 작업 스레드를 생성 후 start() 메소드를 호출해서 실행한다. (2의 예시코드 참고)

thread.start();

 

3-2. Thread 하위 클래스로 생성하기

Runnable로 객체를 생성하지 않고 Thread의 하위 클래스로 작업 스레드를 정의해준다. Thread 클래스를 상속한 후 run() 메소드를 재정의해 스레드가 실행할 코드를 작성한다.

public class Tesk extends Thread{
    @Override
    public void run() {
	// 스레드가 실행할 코드
    }
}

마찬가지로 start() 메소드를 호출해서 실행한다.

public class Exam {
    public static void main(String[] args) {
        Thread thread = new Tesk();
        thread.start();
    }
}

 

참고 : 이것이 자바다

 

728x90

'java' 카테고리의 다른 글

[java] 클래스와 객체  (0) 2021.06.01
[java] java 메모리 구조  (0) 2021.05.25