[Java] 프로세스와 스레드 - 3

2024. 2. 17. 10:52Memorizing/Java

728x90

본 포스팅에서는 스레드를 만들고 실행할 때, 사용할 수 있는 부가적인 개념들에 대해 다룹니다.

Daemon Thread

데몬 스레드는 "보이지 않는 곳에서 실행되는 낮은 우선순위의 스레드"입니다. 보이지 않는 곳이라는 것은 "background"프로세스로 실행된다는 것을 의미합니다. 데몬 프로세스에 대해서는 다른 게시물에 포스팅할 예정입니다. 데몬 스레드의 특징은 Main스레드가 종료되면 작업이 다 수행되지 않았더라도 같이 종료된다는 것입니다. 예제 코드는 아래와 같습니다.

public class Main {
    public static void main(String[] args) {
        Runnable demon = () -> {
            for (int i = 0; i < 1000000; i++) {
                System.out.println("demon");
            }
        };

        Thread thread = new Thread(demon);
        thread.setDaemon(true); // true로 설정시 데몬스레드로 실행됨

        thread.start();

        for (int i = 0; i < 100; i++) {
            System.out.println("task");
        }
    }
}

또한 한 가지 주목할 점은 java에서 스레드는 비동기적으로 실행된다는 것입니다. 위의 코드에서 thread객체의 start메소드를 호출하였는데도 "task"라는 문자열이 출력되므로 이는 비동기적으로 실행되고 있다는 것을 의미합니다. 

Priority

멀티스레드로 작업을 처리하는 경우, 스레드의 작업의 우선순위가 없기 때문에 임의대로 스레드가 수행되는 것을 알 수 있습니다. 스레드의 Priority를 정해주면 Priority가 높은 스레드가 더 많은 리소스를 가지고 수행되어 빨리 종료되도록 할 수 있습니다. 예제 코드는 아래와 같습니다. 아래의 코드에서는 thread1을 우선순위 8로, thread2를 우선순위 2로 지정한 것을 알 수 있습니다. 따라서 thread1의 작업이 더 먼저 수행되어 "$"가 더 많이 빠르게 출력되는 것을 알 수 있습니다. 이러한 특징은 프로그램 자체가 무거울 때, 더 효과적으로 발현됩니다.

public class Main {
    public static void main(String[] args) {
        Runnable task1 = () -> {
            for (int i = 0; i < 100; i++) {
                System.out.print("$");
            }
        };

        Runnable task2 = () -> {
            for (int i = 0; i < 100; i++) {
                System.out.print("*");
            }
        };

        Thread thread1 = new Thread(task1);
        thread1.setPriority(8);
        int threadPriority = thread1.getPriority();
        System.out.println("threadPriority = " + threadPriority);

        Thread thread2 = new Thread(task2);
        thread2.setPriority(2);

        thread1.start();
        thread2.start();
    }
}

'Memorizing > Java' 카테고리의 다른 글

[Java] 제네릭 - 1  (0) 2024.02.19
[Java] 프로세스와 스레드 - 4  (1) 2024.02.17
[Java] 프로세스와 스레드 - 2  (0) 2024.02.17
[Java] 프로세스와 스레드 - 1  (0) 2024.02.17
[Java] 상속  (1) 2024.02.07