πŸ’» 곡뢀 기둝/β˜• Java

Java | Thread / Runnable

  • -

πŸ“Œ Java 의 Thread(μŠ€λ ˆλ“œ)

μŠ€λ ˆλ“œλŠ” μƒˆλ ˆλ“œ 생성을 μœ„ν•΄ μžλ°”μ—μ„œ 미리 κ΅¬ν˜„ν•΄λ‘” ν΄λž˜μŠ€μ΄λ‹€.

 

Process(ν”„λ‘œμ„ΈμŠ€)

 μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨. 즉, μ‚¬μš©μžκ°€ μž‘μ„±ν•œ ν”„λ‘œκ·Έλž¨μ΄ μš΄μ˜μ²΄μ œμ— μ˜ν•΄ λ©”λͺ¨λ¦¬ 곡간을 ν• λ‹Ήλ°›μ•„ μ‹€ν–‰ 쀑인 것을 λ§ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ ν”„λ‘œμ„Έμ„œλŠ” ν”„λ‘œκ·Έλž¨μ— μ‚¬μš©λ˜λŠ” 데이터와 λ©”λͺ¨λ¦¬ λ“±μ˜ μžμ› 그리고 μŠ€λ ˆλ“œλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.

Thread(μŠ€λ ˆλ“œ)

 ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ‹€μ œλ‘œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 주체λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€μ—λŠ” ν•œ 개 μ΄μƒμ˜ μŠ€λ ˆλ“œκ°€ μ‘΄μž¬ν•˜μ—¬ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. λ˜ν•œ, 두 개 μ΄μƒμ˜ μŠ€λ ˆλ“œλ₯Ό κ°€μ§€λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό λ©€ν‹°μŠ€λ ˆλ“œ ν”„λ‘œμ„ΈμŠ€(multi-threaded process) 라고 ν•©λ‹ˆλ‹€.

Multi-Threaded(λ©€ν‹°μŠ€λ ˆλ“œ)

 λ‘ 가지 μ΄μƒμ˜ μŠ€λ ˆλ“œλ₯Ό 가지며, μžλ°”μ—μ„œλŠ” λ©€ν‹° ν”„λ‘œμ„Έμ„œ ν•˜λ“œμ›¨μ–΄λ₯Ό μ§€μ›ν•˜λ„λ‘ 섀계 λ˜μ—ˆμœΌλ―€λ‘œ λ©€ν‹° CPU μ‹œμŠ€ν…œμ—μ„œ 높은 νš¨μœ¨μ„ λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

Thread λ©”μ†Œλ“œ

sleep

ν˜„μž¬ μŠ€λ ˆλ“œ λ©ˆμΆ”κΈ°
μžμ›μ„ ν• λ‹Ήν•œ μƒνƒœλ‘œ μ œμ–΄κΆŒμ„ λ„˜κ²¨μ£Όλ―€λ‘œ λ°λ“œλ½μ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

interupt

λ‹€λ₯Έ μŠ€λ ˆλ“œλ₯Ό κΉ¨μ›Œμ„œ interruptedException 을 λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.
interupt κ°€ λ°œμƒν•œ μŠ€λ ˆλ“œλŠ” μ˜ˆμ™Έλ₯Ό catch ν•˜μ—¬ λ‹€λ₯Έ μž‘μ—…μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

join

λ‹€λ₯Έ μŠ€λ ˆλ“œμ˜ μž‘μ—…μ΄ 끝날 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦¬κ²Œ ν•©λ‹ˆλ‹€.
μŠ€λ ˆλ“œμ˜ μˆœμ„œλ₯Ό μ œμ–΄ν•  λ•Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ“Œ Thread(μŠ€λ ˆλ“œ) κ΅¬ν˜„ 방법

Thread 클래슀둜 μŠ€λ ˆλ“œλ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œλŠ” 이λ₯Ό μƒμ†λ°›λŠ” 클래슀λ₯Ό λ§Œλ“€κ³ , λ‚΄λΆ€μ—μ„œ run λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€. 그리고 μŠ€λ ˆλ“œμ˜ start λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ run λ©”μ†Œλ“œκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€.
// Thread.java
public class Thread {
    public static void main(String[] args) {
        // ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€
        // λ‹€λ₯Έ 클래슀의 μŠ€λ ˆλ“œ
        CleanThread cleanThread = new CleanThread(); // μŠ€λ ˆλ“œ 객체 생성
        // cleanThread.run(); // 주의: run λ©”μ†Œλ“œ 호좜 μ‹œ 일반적인 λ©”μ†Œλ“œ 호좜
        cleanThread.start(); // μŠ€λ ˆλ“œ μ‹€ν–‰
    	// main
        cleanByBoss(); // 사μž₯λ‹˜ μ²­μ†Œ

    }
        public static void cleanByBoss() {
            System.out.println("-- 사μž₯ μ²­μ†Œ μ‹œμž‘ --");
            for (int i = 1; i <= 10; i += 2){
                System.out.println("(사μž₯) " + i + "번방 μ²­μ†Œ 쀑");
            }
            System.out.println("-- 사μž₯ μ²­μ†Œ 끝 --");
        }
}
// CleanThread.java
public class CleanThread extends Thread{ // μŠ€λ ˆλ“œ 클래슀 상속
    public void run() { // Run λ©”μ†Œλ“œ κ΅¬ν˜„
        System.out.println("-- 직원 μ²­μ†Œ μ‹œμž‘ (Thread) --");
        for (int i = 2; i <= 10; i += 2) {
            System.out.println("(직원) " + i + "번방 μ²­μ†Œ 쀑 (Thread)");
        }
        System.out.println("-- 직원 μ²­μ†Œ 끝 (Thread) --");
    }
}

 


23. 3. 8. Runnable μΆ”κ°€

 

πŸ“Œ Java 의 Runnable

Runnable μΈν„°νŽ˜μ΄μŠ€λŠ” 1개의 λ©”μ†Œλ“œ λ§Œμ„ κ°–λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μž…λ‹ˆλ‹€.

 

πŸ“Œ Runnable κ΅¬ν˜„ 방법

// CleanRunnable.java
public class CleanRunnable implements Runnable { // implements Runnable μΆ”κ°€
    @Override
    public void run() { // Run λ©”μ†Œλ“œ ꡬ성
        System.out.println("-- 직원 μ²­μ†Œ μ‹œμž‘ (Runnable) --");
        for (int i = 2; i <= 10; i += 2) {
            System.out.println("(직원) " + i + "번방 μ²­μ†Œ 쀑 (Runnable)");
        }
        System.out.println("-- 직원 μ²­μ†Œ 끝 (Runnable) --");
    }
}
// Runnable.java
public class Runnable {
    public static void main(String[] args) {
        // Runnable μΈν„°νŽ˜μ΄μŠ€
        CleanRunnable cleanRunnable = new CleanRunnable(); // 클래슀 객체 생성
        Thread thread = new Thread(cleanRunnable); // μŠ€λ ˆλ“œ 객체 생성 μƒμ„±μž cleanRunnable μΆ”κ°€
        thread.start(); // μŠ€λ ˆλ“œ μ‹€ν–‰

        cleanByBoss();

    }

    public static void cleanByBoss() {
        System.out.println("-- 사μž₯ μ²­μ†Œ μ‹œμž‘ --");
        for (int i = 1; i <= 10; i += 2){
            System.out.println("(사μž₯) " + i + "번방 μ²­μ†Œ 쀑");
        }
        System.out.println("-- 사μž₯ μ²­μ†Œ 끝 --");
    }
}

 

πŸ“Œ Thread 와 Runnable 비ꡐ

Runnable 은 읡λͺ… 객체둜 μ‚¬μš© κ°€λŠ₯ν•˜μ§€λ§Œ, Thread λŠ” 별도 클래슀λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•œλ‹€λŠ” μ μ—μ„œ λ²ˆκ±°λ‘­μŠ΅λ‹ˆλ‹€. λ˜ν•œ Java μ—μ„œλŠ” 닀쀑 상속이 λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— Thread 클래슀λ₯Ό 상속 λ°›μœΌλ©΄ λ‹€λ₯Έ 클래슀λ₯Ό 상속 받을 수 μ—†μŠ΅λ‹ˆλ‹€.
Thread 클래슀λ₯Ό 상속 λ°›μœΌλ©΄ Thread ν΄λž˜μŠ€μ— κ΅¬ν˜„λœ μ½”λ“œλ“€μ— μ˜ν•΄ 더 λ§Žμ€ μžμ›(λ©”λͺ¨λ¦¬μ™€ μ‹œκ°„ λ“±)을 ν•„μš”λ‘œ ν•˜λ―€λ‘œ Runnable 이 주둜 μ‚¬μš©λ©λ‹ˆλ‹€.

 


 

Thread 와 Runnable 은 μŠ€λ ˆλ“œλ“€μ„ κ΄€λ¦¬ν•˜κΈ° μ–΄λ ΅μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ Java μ—μ„œλŠ” κΎΈμ€€ν•œ λ°œμ „μœΌλ‘œ μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법듀을 λ§Œλ“€μ—ˆκ³ , Java5 에 λ“±μž₯ν•˜λŠ” Executor, ExecutorService, ScheduledExecutionService와 Callable, Future κ°€ μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

좜처 | λ§λ‚˜λ‹ˆκ°œλ°œμž

좜처 | TCP School

'πŸ’» 곡뢀 기둝 > β˜• Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

Java | TDD  (0) 2023.03.10
Java | Session  (1) 2023.01.18
Java | Cookie  (0) 2023.01.17
Java | StringBuilder  (0) 2023.01.17
Java | λ¬Έμžμ—΄ JSON λ³€ν™˜  (0) 2023.01.17
Contents

ν¬μŠ€νŒ… μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€

이 글이 도움이 λ˜μ—ˆλ‹€λ©΄ 곡감 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.