๊ด€๋ฆฌ ๋ฉ”๋‰ด

Unfazedโ—๏ธ๐ŸŽฏ

[Java] ์Šค๋ ˆ๋“œ์˜ ๊ธฐ๋Šฅ๊ณผ ๋””๋ฒ„๊น… ๋ณธ๋ฌธ

Java

[Java] ์Šค๋ ˆ๋“œ์˜ ๊ธฐ๋Šฅ๊ณผ ๋””๋ฒ„๊น…

9taetae9 2025. 2. 6. 11:45
728x90

1. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์˜ ๊ฐœ๋…

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์€ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. Java์—์„œ๋Š” Thread ํด๋ž˜์Šค์™€ Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•ด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
์Šค๋ ˆ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด CPU ์ž์›์„ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๋ฐ ์‘๋‹ต์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.


2. ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ ์ƒ์„ฑํ•˜๊ธฐ

Java์—์„œ ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋จผ์ € Thread ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค. ์ƒ์„ฑ์ž์— Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๊ณ , Runnable ์ธํ„ฐํŽ˜์ด์Šค์˜ run() ๋ฉ”์„œ๋“œ์— ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰ํ•  ๋กœ์ง์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        // ์šด์˜์ฒด์ œ์— ์˜ํ•ด ์Šค์ผ€์ค„ ๋˜๋ฉด ํ•ด๋‹น ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋  ๋กœ์ง
        System.out.println("run() ํ˜ธ์ถœ : " + Thread.currentThread().getName());
        System.out.println("Thread.currentThread().getPriority() = " + Thread.currentThread().getPriority());
        throw new RuntimeException("Intentional Exception");
    }
});

ใ……

์ด ์ฝ”๋“œ์—์„œ๋Š” ์ต๋ช… ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์œผ๋ฉฐ, run() ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์Šค๋ ˆ๋“œ ์ด๋ฆ„๊ณผ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ถœ๋ ฅํ•œ ํ›„ ์˜๋„์ ์œผ๋กœ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋กœ์ง์„ ๋‹ด๊ณ  ์žˆ๋‹ค.

 

3. ์Šค๋ ˆ๋“œ์˜ ์‹คํ–‰๊ณผ ๊ด€๋ฆฌ

์Šค๋ ˆ๋“œ ์‹œ์ž‘

์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•œ ํ›„์—๋Š” start() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ JVM์ด ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์šด์˜์ฒด์ œ์— ์ „๋‹ฌํ•˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ๋‹จ์ˆœํžˆ ์Šค๋ ˆ๋“œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

thread.start();

ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์Šค๋ ˆ๋“œ ํ™•์ธ

๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ์˜ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด, Thread.currentThread() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์Šค๋ ˆ๋“œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

System.out.println("[์ƒˆ ์Šค๋ ˆ๋“œ ์‹œ์ž‘ ์ „] Thread.currentThread().getName() = " + Thread.currentThread().getName());

์Šค๋ ˆ๋“œ ์ผ์‹œ์ •์ง€

Thread.sleep() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ํ˜„์žฌ ์Šค๋ ˆ๋“œ๋ฅผ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์ผ์‹œ์ •์ง€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ, CPU ์ž์›์„ ์†Œ๋ชจํ•˜์ง€ ์•Š๊ณ  ์šด์˜์ฒด์ œ์— ์˜ํ•ด ํ•ด๋‹น ์‹œ๊ฐ„ ๋™์•ˆ ์Šค์ผ€์ค„๋˜์ง€ ์•Š๋Š”๋‹ค.

Thread.sleep(10000);

 

4. ์Šค๋ ˆ๋“œ์˜ ์ด๋ฆ„๊ณผ ์šฐ์„ ์ˆœ์œ„ ์„ค์ •

์Šค๋ ˆ๋“œ ์ด๋ฆ„ ๋ณ€๊ฒฝ

๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ๋Š” โ€œThread-0โ€๊ณผ ๊ฐ™์ด ์ž๋™์œผ๋กœ ์ด๋ฆ„์ด ์ง€์ •๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๋””๋ฒ„๊น…๊ณผ ๊ด€๋ฆฌ์— ๋„์›€์ด ๋œ๋‹ค.
์ด๋ฅผ ์œ„ํ•ด setName() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

thread.setName("New Worker ์Šค๋ ˆ๋“œ");

 

์Šค๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„ ์„ค์ •

Java ์Šค๋ ˆ๋“œ๋Š” 1๋ถ€ํ„ฐ 10๊นŒ์ง€์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ ์šฐ์„ ์ˆœ์œ„๋Š” Thread.NORM_PRIORITY์ด๋‹ค.
ํŠน์ • ์Šค๋ ˆ๋“œ์˜ ์‘๋‹ต์„ฑ์„ ๋†’์ด๊ฑฐ๋‚˜ ์ค‘์š”๋„๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด setPriority() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

thread.setPriority(Thread.MAX_PRIORITY); //์šด์„  ์ˆœ์œ„ ์ง€์ •(10=max) => ์‘๋‹ต์„ฑ ๋†’์•„์ง

 

์‹คํ–‰ ์ค‘ getPriority() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์šฐ์„ ์ˆœ์œ„๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•œ ๊ฐ’์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

5. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐ Uncaught Exception Handler

์Šค๋ ˆ๋“œ ๋‚ด์—์„œ ๋ฐœ์ƒํ•œ unchecked ์˜ˆ์™ธ๊ฐ€ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์œผ๋ฉด ์Šค๋ ˆ๋“œ ์ „์ฒด๊ฐ€ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ,
์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด setUncaughtExceptionHandler() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.
์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ•ธ๋“ค๋Ÿฌ๋Š” ํ•ด๋‹น ์Šค๋ ˆ๋“œ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ catch ๋ธ”๋ก์—์„œ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค.

thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler(){
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("์Šค๋ ˆ๋“œ์—์„œ ์น˜๋ช…์ ์ธ error ๋ฐœ์ƒ  = " + t.getName() + " \n๋ฐœ์ƒ error = " + e.getMessage());
    }
});

 

6. ์ „์ฒด ์ฝ”๋“œ

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                // ์šด์˜์ฒด์ œ์— ์˜ํ•ด ์Šค์ผ€์ค„ ๋˜๋ฉด ํ•ด๋‹น ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋  ๋กœ์ง
                System.out.println("run() ํ˜ธ์ถœ : " + Thread.currentThread().getName());
                System.out.println("Thread.currentThread().getPriority() = " + Thread.currentThread().getPriority());
                throw new RuntimeException("Intentional Exception");
            }
        });

        thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler(){
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                System.out.println("์Šค๋ ˆ๋“œ์—์„œ ์น˜๋ช…์ ์ธ error ๋ฐœ์ƒ  = " + t.getName() + " \n๋ฐœ์ƒ error = " + e.getMessage());
            }
        });

        thread.setName("New Worker ์Šค๋ ˆ๋“œ"); // ๊ธฐ๋ณธ Thread-0 ๋Œ€์‹  ์ƒˆ ์ด๋ฆ„ ์ง€์ •
        thread.setPriority(Thread.MAX_PRIORITY); // ์šฐ์„ ์ˆœ์œ„ ์ง€์ • (10 = MAX)

        System.out.println("[์ƒˆ ์Šค๋ ˆ๋“œ ์‹œ์ž‘ ์ „] Thread.currentThread().getName() = " + Thread.currentThread().getName());
        thread.start(); // JVM์ด ์ƒˆ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ด OS์— ์ „๋‹ฌ
        System.out.println("[์ƒˆ ์Šค๋ ˆ๋“œ ์‹œ์ž‘ ํ›„] Thread.currentThread().getName() = " + Thread.currentThread().getName());

        // ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์ •์ง€์‹œํ‚ด (CPU ์†Œ๋ชจ ์—†์Œ)
        Thread.sleep(10000);
    }
}

 

์ถ”๊ฐ€ - ๋””๋ฒ„๊น…๊ณผ ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ

IDE๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋””๋ฒ„๊น…์ด ์šฉ์ดํ•ด์ง„๋‹ค.
๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ๋ฅผ ์„ค์ •ํ•˜๊ณ  ์Šค๋ ˆ๋“œ ํƒญ์„ ํ™•์ธํ•˜๋ฉด ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ชจ๋“  ์Šค๋ ˆ๋“œ์™€ ๊ฐ ์Šค๋ ˆ๋“œ์˜ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ์— ๋„๋‹ฌํ•˜๋ฉด ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ผ์‹œ์ •์ง€๋˜๋ฏ€๋กœ, ๊ฐ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

์ฐธ๊ณ  ์ž๋ฃŒ:

Udemy - Java ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ, ๋ณ‘ํ–‰์„ฑ ๋ฐ ๋ณ‘๋ ฌ ์‹คํ–‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ „๋ฌธ๊ฐ€ ๋˜๊ธฐ

https://docs.oracle.com/javase/10/docs/api/java/lang/Thread.State.html

 

Thread.State (Java SE 10 & JDK 10 )

 

docs.oracle.com

 

728x90