Sam Story

JAVA - 스레드 (Thread) 본문

JAVA

JAVA - 스레드 (Thread)

Sam H 2024. 5. 12. 16:48

1. 스레드 (Thread) 란?

 

사전적 의미로는 '실' 이라는 뜻이다.

 

프로그래밍에 있어서 스레드는 프로그램 내에서 실행되는 흐름의 '단위' 라고 할 수있다.

 

모든 프로그램에는 최소 한개의 스레드가 작업을 수행한다.

 

일반적으로 Main 스레드 하나로 시작하여 스레드를 추가 생성하게 되면

 

멀티 스레드 환경이 된다.

 

 

싱글 스레드와 멀티 스레드에 관련된 내용은 아래 포스팅을 참고 하도록 하자.

 

 

싱글스레드 , 멀티스레드 (Single Thread , Multi Thread)

1. 스레드란 ? 프로세스가 할당받은 자원을 이용하는 실행의 단위 한 프로세스 내에서 동작되는 여러 실행 흐름 멀티 스레드의 경우 스레드 간의 자원을 공유하고 자원의 생성과 관리의 중복성

samtistory.tistory.com

 

 

 

오늘 사용해볼 예제는 멀티스레드를 이용한 간단한 예제를 만들어 보도록 하자.

 

 

 

2. 예제

자바에서 스레드를 생성하는 방법에는 2가지가 있다.

 

1. Thread 클래스를 상속 받아서 사용

 

2. Runnable 인터페이스를 구현해서 사용

 

이러하게 두가지 방법으로 이용되는 이유는 자바에서는 단일 상속만을 허용하기 때문이다.

 

그래서 이미 다른 클래스를 상속받고 있는 클래스에서는 Thread 클래스를 상속받지 못한다.

 

그럴 때에는 Runnable 인터페이스에서 스레드를 구현해야 한다.

 

오늘은 Thread 클래스를 직접 상속받아 사용하는 예제를 구현해보려고 한다.

 

 

이렇게 두가지 방법으로 스레드를 만들었다면 run() 메서드를 사용해 작성할 수 있다.

 

이렇게 작성한 스레드는 메인 스레드에서 start() 메서드를 사용해 호출 할 수 있다. 

 

 

오늘 예제는 간단하게 1 ~ 10 까지 1초 간격으로 카운트 하는 예제를 만들어 보도록 하겠다.

 

 

TestThread 클래스

public class TestThread extends Thread{

    int count = 1;

    // run() 메서드를 Override 해서 작성해준다.
    @Override
    public void run() {

        for (int i = 0; i < 10; i++) {

            System.out.println("현재 카운트 : " + count);

            // Thread.sleep 메서드 -> 지정된 시간을 sleep 한다.
            // 밀리초 단위이므로 1초 = 1000 으로 환산한다.
            try {

                Thread.sleep(1000);
                count ++;

            } catch (InterruptedException e) {

                throw new RuntimeException(e);

            }

        }

    }

}

 

sleep 메서드를 호출할 때 try / catch 구문을 사용하는 이유는 문법적으로 지켜야할 약속이다.

자바에서 스레드를 사용하기 위해서는 try / catch 문이 강제되기 때문이다.

 

 

메인 클래스

public class ThreadExample {
    public static void main(String[] args) {

        // 스레드 객체 생성 후 초기화
        TestThread testThread = new TestThread();
        
        // start() 메서드를 호출해서 스레드 작동
        testThread.start();

    }
}

 

위와 같이 코드를 작성하고 실행하게 되면 어떻게 될까?

 

 

실행 결과

실행 결과

 

콘솔에 출력문이 1초에 한번씩 카운트가 증가하며 나타나는 걸 확인할 수 있다.

 

 

 

이러한 스레드를 사용해 메인스레드와 별개로 작동하는 스레드들을 구현할 수 있고

 

간단한 타이머를 구현한다던가 등 여러가지 작업들을 할 수 있다.

 

뿐만 아니라 메인스레드와 별개로 작업하는 일들 또한 스레드를 사용해 멀티스레드 형태로

 

만들어서 구현할 수 있다.

 

잘만 사용한다면 재밌는 기능들을 만들때 유용하게 사용할 수 있다고 생각한다.

 

 

오늘의 예제 깃허브 주소

 

GitHub - nam-su/JavaThreadExample

Contribute to nam-su/JavaThreadExample development by creating an account on GitHub.

github.com

 

'JAVA' 카테고리의 다른 글

JAVA - 2~36진수 기수변환  (0) 2024.09.29
JAVA - 자료구조 Map  (4) 2024.09.21
JAVA - 랜덤 함수 (Random class)  (0) 2024.05.06
JAVA - 배열 요소의 내림차순,오름차순  (0) 2024.03.23
JAVA - 문자열 자르기 Split  (0) 2024.03.17