λ² μ–΄_
TechBear
λ² μ–΄_
전체 방문자
였늘
μ–΄μ œ
  • λΆ„λ₯˜ 전체보기 (336)
    • Spring (33)
      • κ°œλ… (13)
      • Security (5)
      • μ‹€μŠ΅ (1)
      • ν† λΉ„ μŠ€ν”„λ§ (11)
    • JPA (6)
    • ν”„λ‘œμ νŠΈ 기둝 (24)
    • DB (13)
    • JAVA (18)
    • μ•Œκ³ λ¦¬μ¦˜ (50)
      • μœ ν˜•μ •λ¦¬ (8)
      • Baekjoon (21)
      • LeetCode (18)
    • λ””μžμΈνŒ¨ν„΄ (0)
    • κ°œλ°œμ„œμ  (79)
      • Effective Java (78)
      • 객체지ν–₯의 사싀과 μ˜€ν•΄ (1)
    • 독후감 (4)
    • λ³΄μ•ˆ (2)
    • 운영체제(OS) (53)
      • 곡룑책 (53)
    • 컴퓨터 λ„€νŠΈμ›Œν¬ (28)
      • 컴퓨터 λ„€νŠΈμ›Œν¬ ν•˜ν–₯식 μ ‘κ·Ό (23)
    • 자료ꡬ쑰 (1)
    • DevOps (2)
    • μ•± 개발 (20)
      • μ•ˆλ“œλ‘œμ΄λ“œ μŠ€νŠœλ””μ˜€ (20)

λΈ”λ‘œκ·Έ 메뉴

    곡지사항

    인기 κΈ€

    νƒœκ·Έ

    • java
    • dfs
    • μŠ€ν”„λ§
    • λ°±μ€€
    • μ΄νŽ™ν‹°λΈŒμžλ°”
    • μŠ€λ ˆλ“œ
    • λ°μ΄ν„°λ² μ΄μŠ€
    • ν•¨μˆ˜ν˜•μΈν„°νŽ˜μ΄μŠ€
    • μžλ°”8
    • μžλ°”
    • leetcode
    • μŠ€ν”„λ§μ‹œνλ¦¬ν‹°
    • ν† λΉ„μŠ€ν”„λ§
    • C++
    • μ½”λ“œμ—…
    • μ•Œκ³ λ¦¬μ¦˜
    • 운영체제
    • BFS
    • jpa
    • Spring

    졜근 λŒ“κΈ€

    졜근 κΈ€

    ν‹°μŠ€ν† λ¦¬

    hELLO Β· Designed By μ •μƒμš°.
    λ² μ–΄_

    TechBear

    [Java] μ“°λ ˆλ“œ μ™„λ²½ 정리
    JAVA

    [Java] μ“°λ ˆλ“œ μ™„λ²½ 정리

    2023. 7. 14. 01:38

    πŸ” ν”„λ‘œμ„ΈμŠ€μ™€ μ“°λ ˆλ“œ

       ν”„λ‘œμ„ΈμŠ€λž€ '싀행쀑인 ν”„λ‘œκ·Έλž¨'을 λ§ν•œλ‹€. μš°λ¦¬κ°€ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚€λ©΄ OS(μœˆλ„μš°, Mac λ“±)λŠ” ν”„λ‘œκ·Έλž¨ 싀행에 ν•„μš”ν•œ 데이터와 λ©”λͺ¨λ¦¬ λ“±μ˜ μžμ›μ„ ν• λ‹Ήν•œλ‹€. ν”„λ‘œμ„ΈμŠ€λŠ” μ΄λ ‡κ²Œ ν• λ‹Ή 받은 μžμ›κ³Ό μ“°λ ˆλ“œλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€. 

    μ“°λ ˆλ“œλŠ” 'ν”„λ‘œμ„ΈμŠ€κ°€ ν• λ‹Ή 받은 μžμ›μ„ ν™œμš©ν•˜μ—¬ μ‹€μ œ μž‘μ—…μ„ μ΄ν–‰ν•˜λŠ” 쑴재' λ₯Ό λ§ν•œλ‹€. μ“°λ ˆλ“œμ˜ μƒμ„±μ—λŠ” μ œν•œμ΄ μ—†μ§€λ§Œ, μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬ 곡간을 ν•„μš”λ‘œ ν•œλ‹€. μ“°λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€κ°€ κ°€μ§€κ³  μžˆλŠ” μžμ›μ„ ν• λ‹Ήλ°›κΈ° λ•Œλ¬Έμ— ν”„λ‘œμ„ΈμŠ€μ˜ λ©”λͺ¨λ¦¬ ν•œκ³„μΉ˜κΉŒμ§€λ§Œ 생성할 수 μžˆλ‹€. 

     

    πŸ” λ©€ν‹° νƒœμŠ€ν‚Ήκ³Ό λ©€ν‹° μ“°λ ˆλ”©

       μš°λ¦¬λŠ” λ¬Έμ„œ μž‘μ—…μ„ ν•˜λ©΄μ„œ λ™μ‹œμ— 유튜브 μŒμ•…μ„ 감상할 수 μžˆλ‹€. μ΄λŠ” μœˆλ„μš°μ™€ 같은 μš΄μ˜μ²΄μ œλŠ” λ©€ν‹°νƒœμŠ€ν‚Ήμ„ μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμ— κ°€λŠ₯ν•œ 일이닀. λ©€ν‹° νƒœμŠ€ν‚Ήμ€ 두 κ°€μ§€ μ΄μƒμ˜ μž‘μ—…μ„ λ™μ‹œμ— ν•˜λŠ” 것을 μ˜λ―Έν•˜λ©°, ν”„λ‘œμ„ΈμŠ€ + ν”„λ‘œμ„ΈμŠ€ μ‘°ν•© 뿐만 μ•„λ‹ˆλΌ ν•œ ν”„λ‘œμ„ΈμŠ€μ•ˆμ˜ μž‘μ—…1 + μž‘μ—…2λ₯Ό μ˜λ―Έν•  수 μžˆλ‹€.

     

    μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” CPU의 μ½”μ–΄λŠ” ν•œ λ²ˆμ— 단 ν•˜λ‚˜μ˜ μž‘μ—…λ§Œ μˆ˜ν–‰ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ λ¬Έμ„œ μž‘μ—…μ„ ν•˜λ©΄μ„œ 유튜브 μŒμ•…μ„ λ™μ‹œμ— ν•˜λ €λ©΄ μ΅œμ†Œ 두 개의 μ½”μ–΄κ°€ ν•„μš”ν•˜λ‹€. μš°λ¦¬λŠ” λ¬Έμ„œ μž‘μ—…λ„ν•˜κ³  μŒμ•…λ„ κ°μƒν•˜κ³  λ©”μ‹ μ €μ—μ„œ 문자λ₯Ό λ³΄λ‚΄λ©΄μ„œ νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•˜κΈ°λ„ ν•œλ‹€. μ΄λ ‡κ²Œ ν•œ ν”„λ‘œμ„ΈμŠ€μ•ˆμ—μ„œ μ΄λ£¨μ–΄μ§€λŠ” μž‘μ—…μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ½”μ–΄λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ ν”„λ‘œκ·Έλž¨μ„ λͺ‡ 개 μ‹€ν–‰ν•˜μ§€ λͺ»ν•  것이닀.

     

    이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ©€ν‹° μ“°λ ˆλ”©μ„ μ΄μš©ν•  수 μžˆλ‹€. λ©€ν‹° μ“°λ ˆλ”©μ€ μ—¬λŸ¬ 개의 μ“°λ ˆλ“œκ°€ λ²ˆκ°ˆμ•„κ°€λ©° μ‹€ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ 보이게 ν•˜λŠ” 기술둜 μ½”μ–΄λŠ” 맀우 λΉ λ₯Έ μ†λ„λ‘œ μ“°λ ˆλ“œλ₯Ό μ „ν™”ν•˜λ©΄μ„œ 각 μ“°λ ˆλ“œμ—κ²Œ μž‘μ—…μ„ ν• λ‹Ήν•œλ‹€.

     

    πŸ—οΈ μ–‘λ‚ μ˜ κ²€ - λ©€ν‹° μ“°λ ˆλ”©

       λ©€ν‹° μ“°λ ˆλ”©μ€ λ‹€μŒκ³Ό 같은 μž₯점이 μžˆμ–΄ 많이 μ‚¬μš©λœλ‹€.

    1. CPU의 μ‚¬μš©λ₯ μ΄ μ¦κ°€ν•œλ‹€. 
    2. μžμ›μ„ 보닀 효율적으둜 μ‚¬μš©ν•  수 μžˆλ‹€. 
    3. μ‚¬μš©μžμ˜ μš”μ²­μ— λΉ λ₯΄κ²Œ 응닡할 수 μžˆλ‹€.

    ν•˜μ§€λ§Œ λ©€ν‹° μ“°λ ˆλ”©μ€ μ—¬λŸ¬ μ“°λ ˆλ“œκ°€ 같은 ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μžμ›μ„ κ³΅μœ ν•˜λ©΄μ„œ μž‘μ—… ν•˜κΈ° λ•Œλ¬Έμ— 동기화, κ΅μ°©μƒνƒœμ™€ 같은 λ¬Έμ œκ°€ 생길 수 μžˆλ‹€.

     

    πŸ” μ“°λ ˆλ“œμ˜ κ΅¬ν˜„κ³Ό μ‹€ν–‰

        μ“°λ ˆλ“œλ₯Ό κ΅¬ν˜„ν•˜λŠ” λ°©λ²•μ—λŠ” Thread.classλ₯Ό μƒμ†ν•˜λŠ” 방법과 Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법이 μžˆλ‹€. 두 κ°€μ§€ 방법 λͺ¨λ‘ run() λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬ λͺΈμ²΄λ₯Ό μž‘μ„±ν•˜λ©΄ λœλ‹€.

     

    πŸ—οΈ Thread 클래슀

        Thread ν΄λž˜μŠ€λŠ” Threadλ₯Ό μƒμ†ν•œ μžμ‹ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œ λ’€ start() λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•΄ μ‹€ν–‰μ‹œν‚¬ 수 μžˆλ‹€.

    class ThreadEx extends Thread {
    	public void run() { ... }
    }
    
    class ThreadMain {
    	public static void main(String[] args) {
        	ThreadEx t = new ThreadEx();
            t.start();
        }
    }

     

    πŸ—οΈ Runnable μΈν„°νŽ˜μ΄μŠ€

       Runnable μΈν„°νŽ˜μ΄μŠ€μ˜ 경우 Runnable을 μƒμ†ν•œ μžμ‹ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ†ν•œ 뒀에 Thread(Runnable target) μƒμ„±μžλ‘œ Threadλ₯Ό μƒμ„±ν•˜λ©΄ λœλ‹€.

    public class ThreadEx2 implement Runnable {
    	public void run() { ... }
    }
    
    public class ThreadMain {
    	public static void main(String[] args) {
        	Runnable r = new ThreadEx2();
            Thread t = new Thread(r);
            t.start();
        }
    }

     

    πŸ—οΈ Runnable이 μ„ ν˜Έλ˜λŠ” 이유

    Thread ν΄λž˜μŠ€κ°€ java.lang.Thread 클래슀만 닀루기 λ•Œλ¬Έμ— 더 μ‰¬μ›Œλ³΄μ΄μ§€λ§Œ Runnable이 더 많이 μ‚¬μš©λ˜κ³  μžˆλ‹€. μ΄μœ λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

    • μžλ°”λŠ” 닀쀑 상속을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ Threadλ₯Ό μ‚¬μš©ν•œλ‹€λŠ” 것은 λ‹€λ₯Έ 클래슀λ₯Ό 상속할 수 μ—†μŒμ„ μ˜λ―Έν•˜κΈ°λ„ ν•œλ‹€.
    • Runnable μΈν„°νŽ˜μ΄μŠ€λŠ” Thread λ˜λŠ” Executors 등에 μ˜ν•΄ 싀행될 수 있기 λ•Œλ¬Έμ— Runnable을 μ‚¬μš©ν•˜λŠ” 것이 쒋은 λ””μžμΈ 결정이닀.
    • Runnable둜 μž‘μ—…μ„ λΆ„λ¦¬ν•œλ‹€λŠ” 것은 κ·Έ μž‘μ—…μ„ μž¬μ‚¬μš©ν•  수 있으며 λ‹€λ₯Έ μ‹€ν–‰μžμ— μ˜ν•΄ 싀행될 수 μžˆμŒμ„ μ˜λ―Έν•œλ‹€. 

     

    πŸ—οΈ μ–Έμ œ Thread을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”κ°€?

    • OOPμ—μ„œ 클래슀λ₯Ό μƒμ†ν•œλ‹€λŠ” 것은 μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•˜κ±°λ‚˜, κ°œμ„  및 μˆ˜μ • ν•œλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. λ”°λΌμ„œ Threadμ—μ„œ μ–΄λ– ν•œ κΈ°λŠ₯ μΆ”κ°€λ‚˜ μˆ˜μ •μ„ ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μž.

     

    πŸ—οΈ start() λ©”μ†Œλ“œ

       μ“°λ ˆλ“œλ₯Ό μƒμ„±ν•œ λ’€μ—λŠ” start() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μ‹€ν–‰μ‹œμΌœμ€˜μ•Ό ν•œλ‹€. start() λ©”μ†Œλ“œκ°€ 호좜되면 μ‹€ν–‰λŒ€κΈ° μƒνƒœμ— μžˆλ‹€κ°€ μžμ‹ μ˜ μƒνƒœκ°€ 되면 μ‹€ν–‰λœλ‹€. 또 start()λŠ” ν•œ 번만 호좜될 수 μžˆλ‹€. 

    ν•œ κ°€μ§€ μ΄μƒν•œ 점은 ThreadEx ν΄λž˜μŠ€λŠ” Threadλ₯Ό μƒμ†ν•˜κ³  run() λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν–ˆλ‹€. 그런데 μ“°λ ˆλ“œλ₯Ό μ‹€ν–‰μ‹œν‚€κΈ° μœ„ν•΄ ν˜ΈμΆœν•˜λŠ” λ©”μ†Œλ“œλŠ” start()이닀. start() λ©”μ†Œλ“œμ—λŠ” native λ©”μ†Œλ“œλ‘œ μ“°λ ˆλ“œμ˜ μž‘μ—…μ„ μ‹€ν–‰ν•œλ‹€. native λ©”μ†Œλ“œλŠ” μƒˆλ‘œμš΄ μ“°λ ˆλ“œκ°€ μž‘μ—…μ„ μ‹€ν–‰ν•˜λŠ”λ° ν•„μš”ν•œ ν˜ΈμΆœμŠ€νƒμ„ μƒμ„±ν•œ λ‹€μŒ run() λ©”μ†Œλ“œλ₯Ό μ‹€ν–‰ν•œλ‹€. 

    Thread 클래슀의 start() λ©”μ†Œλ“œ

    run() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ 호좜 μŠ€νƒμ΄ μƒμ„±λ˜μ§€ μ•Šκ³  λ©”μ†Œλ“œλ§Œ 호좜되며, start() λ©”μ†Œλ“œλŠ” ν˜ΈμΆœμŠ€νƒμ„ μƒμ„±ν•œ λ‹€μŒ run() λ©”μ†Œλ“œλ₯Ό μ‹€ν–‰ν•œλ‹€.

    start() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œ λ’€μ˜ 호좜 μŠ€νƒ

    πŸ” μ‹±κΈ€ μ“°λ ˆλ“œμ™€ λ©€ν‹° μ“°λ ˆλ“œ

    ν•˜λ‚˜μ˜ μ“°λ ˆλ“œλ‘œ 두 개의 μž‘μ—…μ„ ν•˜λŠ” 경우 P1을 마친 후에 P2의 μž‘μ—…μ„ μ‹œμž‘ν•œλ‹€. 두 개의 μ“°λ ˆλ“œλ‘œ 두 개의 μž‘μ—…μ„ ν•˜λŠ” 경우 짧은 μ‹œκ°„λ™μ•ˆ 두 개의 μ“°λ ˆλ“œκ°€ λ²ˆκ°ˆμ•„ κ°€λ©΄μ„œ μˆ˜ν–‰λœλ‹€. 

    μ™Όμͺ½(μ‹±κΈ€ μ“°λ ˆλ“œ), 였λ₯Έμͺ½(λ©€ν‹° μ“°λ ˆλ“œ)

    λ‹¨μˆœ μ—°μ‚°μ˜ 경우 단일 μ“°λ ˆλ“œμ˜ μž‘μ—…μ΄ μ˜€λž˜κ±Έλ¦¬κΈ°λ„ ν•œλ‹€. μ΄λŠ” μ“°λ ˆλ“œκ°„μ˜ μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ΄ λ°œμƒν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ΄λž€ λ‹€μŒμ— μ‹€ν–‰ν•΄μ•Όν•  μœ„μΉ˜ λ“±μ˜ 정보λ₯Ό μ €μž₯ν•˜κ³  읽어 μ˜€λŠ” 과정을 μ˜λ―Έν•œλ‹€. λ©€ν‹° μ½”μ–΄μ—μ„œ λ©€ν‹° μ“°λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λŠ” μžμ›μ„ κΈ°λ‹€λ¦¬λŠ” μ‹œκ°„μ΄ 생길 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ ν•œ μ“°λ ˆλ“œκ°€ 화면에 좜λ ₯ν•˜κ³  μžˆλŠ” λ™μ•ˆ λ‹€λ₯Έ μ“°λ ˆλ“œλŠ” 좜λ ₯이 λλ‚˜κΈ°λ₯Ό κΈ°λ‹€λ €μ•Ό ν•œλ‹€. 

    두 μ“°λ ˆλ“œκ°€ μ„œλ‘œ λ‹€λ₯Έ μžμ›μ„ μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λŠ” λ©€ν‹° μ“°λ ˆλ“œκ°€ 더 νš¨μœ¨μ μ΄λ‹€. 예λ₯Ό λ“€λ©΄ μ‚¬μš©μžλ‘œλΆ€ν„° 데이터λ₯Ό μž…λ ₯λ°›λŠ” μž‘μ—…, λ„€νŠΈμ›Œν¬λ‘œ νŒŒμΌμ„ μ£Όκ³  λ°›λŠ” μž‘μ—… 등이 ν•΄λ‹Ήλœλ‹€. 

    πŸ”  μ“°λ ˆλ“œμ˜ μš°μ„ μˆœμœ„

       setPriority(int priority), getPriority()λ₯Ό μ΄μš©ν•˜μ—¬ μ“°λ ˆλ“œμ˜ μš°μ„ μˆœμœ„λ₯Ό μ§€μ •ν•˜κ±°λ‚˜ 확인할 수 μžˆλ‹€. μš°μ„ μˆœμœ„ λ²”μœ„λŠ” 1 ~ 10이며 μˆ«μžκ°€ λ†’μ„μˆ˜λ‘ μš°μ„ μˆœμœ„κ°€ λ†’λ‹€. 

    λ©€ν‹°μ½”μ–΄μ—μ„œλŠ” μ“°λ ˆλ“œμ˜ μš°μ„ μˆœμœ„μ— λ”°λ₯Έ 차이가 거의 μ—†μœΌλ©°, OSλ§ˆλ‹€ λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ μŠ€μΌ€μ₯΄λ§ ν•˜κΈ° λ•Œλ¬Έμ— κ²°κ³Όκ°€ λ‹¬λΌμ§ˆ 수 μžˆλ‹€. λ”°λΌμ„œ μ“°λ ˆλ“œμ— μš°μ„ μˆœμœ„λ₯Ό λΆ€μ—¬ν•˜κΈ°λ³΄λ‹€ μš°μ„ μˆœμœ„λ₯Ό PriorityQueue에 μ €μž₯ν•΄ 놓고, μš°μ„ μˆœμœ„κ°€ 높은 μž‘μ—…μ΄ λ¨Όμ € μ²˜λ¦¬λ˜λ„λ‘ ν•˜λŠ” 것이 μ’‹λ‹€.

    πŸ” 데λͺ¬ μ“°λ ˆλ“œ

       λ°λͺ¬ μ“°λ ˆλ“œλŠ” 일반 μ“°λ ˆλ“œμ˜ μž‘μ—…μ„ λ‹λŠ” 보쑰 μ“°λ ˆλ“œμ΄λ‹€. 예λ₯Ό λ“€μ–΄ λ¬Έμ„œ ν”„λ‘œκ·Έλž¨μ˜ μžλ™μ €μž₯, ν™”λ©΄μžλ™κ°±μ‹  등이 μžˆλ‹€. 기본적으둜 κ΅¬ν˜„μ€ λ¬΄ν•œλ£¨ν”„μ™€ 쑰건문을 μ΄μš©ν•΄μ„œ μ‹€ν–‰ ν›„ λŒ€κΈ°ν•˜κ³  μžˆλ‹€κ°€ νŠΉμ • 쑰건이 만쑱되면 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³  λ‹€μ‹œ λŒ€κΈ°ν•˜λ„λ‘ μž‘μ„±ν•œλ‹€. 데λͺ¬ μ“°λ ˆλ“œλŠ” μ‹€ν–‰ν•˜κΈ° 전에 setDaemon(true)λ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€. 

    public class DaemonThreadExample {
        public static void main(String[] args) {
            MyThread myThread = new MyThread();
            myThread.setDaemon(true);
            myThread.start();
    
            // 메인 μŠ€λ ˆλ“œ μ‹€ν–‰ 쀑
            try {
                Thread.sleep(3000); // 3μ΄ˆκ°„ λŒ€κΈ°
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            System.out.println("메인 μŠ€λ ˆλ“œ μ’…λ£Œ");
        }
    }
    
    class MyThread extends Thread {
        public void run() {
            while (true) {
                System.out.println("데λͺ¬ μŠ€λ ˆλ“œ μ‹€ν–‰ 쀑");
                try {
                    Thread.sleep(1000); // 1μ΄ˆκ°„ λŒ€κΈ°
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    πŸ”  μ“°λ ˆλ“œμ˜ μ‹€ν–‰μ œμ–΄

       μ“°λ ˆλ“œμ˜ 싀행을 μ œμ–΄ν•˜λŠ” sleep(), join(), interrupt(), suspend(), resume(), yield()에 λŒ€ν•΄ μ•Œμ•„λ³΄μž.

    πŸ—οΈ μ“°λ ˆλ“œμ˜ μƒνƒœ κ·Έλž˜ν”„

    μ“°λ ˆλ“œ μƒνƒœ κ·Έλž˜ν”„

    1. μ“°λ ˆλ“œλ₯Ό μƒμ„±ν•˜κ³  μ‹€ν–‰ν•˜μ§€ μ•Šμ€ μƒνƒœλ₯Ό NEW라고 ν•˜λ©°, start() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ μ‹€ν–‰ λŒ€κΈ°(Runnable) μƒνƒœκ°€ λœλ‹€. 
    2. μ‹€ν–‰ λŒ€κΈ° μƒνƒœμ—μ„œ μ°¨λ‘€λŒ€λ‘œ 싀행이 λœλ‹€. 
    3. μ£Όμ–΄μ§„ μ‹€ν–‰μ‹œκ°„μ΄ λ‹€ λ˜κ±°λ‚˜ yield()κ°€ 호좜되면 λ‹€μ‹œ μ‹€ν–‰ λŒ€κΈ°μƒνƒœκ°€ λœλ‹€. 
    4. μ‹€ν–‰ 쀑에 suspend(), sleep(), wait(), join(), I/O block에 μ˜ν•΄ μΌμ‹œμ •μ§€μƒνƒœκ°€ 될 수 μžˆλ‹€. 
    5. μΌμ‹œμ •μ§€μ‹œκ°„μ΄ λ‹€λ˜κ±°λ‚˜ notify(), resume(), interrupt() λ©”μ„œλ“œκ°€ 호좜되면 λ‹€μ‹œ μ‹€ν–‰λŒ€κΈ° μƒνƒœκ°€ λœλ‹€. 
    6. 싀행을 λͺ¨λ‘ 마치면 μ†Œλ©Έ(TERMINATED) λœλ‹€.

     

    πŸ—οΈ  sleep() λ©”μ†Œλ“œ

       sleep()은 μ§€μ •λœ μ‹œκ°„λ™μ•ˆ μ“°λ ˆλ“œλ₯Ό λ©ˆμΆ”κ²Œ ν•œλ‹€. sleep()에 μ˜ν•΄ μΌμ‹œμ •μ§€ μƒνƒœκ°€ 된 μ“°λ ˆλ“œλŠ” μ§€μ •λœ μ‹œκ°„μ΄ λ‹€ λ˜κ±°λ‚˜ interrupt()κ°€ 호좜되면 InterruptedException이 λ°œμƒν•˜κ³ , μ‹€ν–‰λŒ€κΈ° μƒνƒœκ°€ λœλ‹€. λ”°λΌμ„œ sleep()을 ν˜ΈμΆœν•  λ•ŒλŠ” 항상 try-catch문으둜 μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•΄μ€˜μ•Ό ν•œλ‹€. 

    void delay(long millis) {
        try {
        	Thread.sleep(millis);
        } catch (InterruptedException e ) {}
    }

    sleep()은 항상 ν˜„μž¬ μ‹€ν–‰ 쀑인 μ“°λ ˆλ“œμ— λŒ€ν•΄ μž‘λ™ν•˜κΈ° λ•Œλ¬Έμ— μ°Έμ‘°λ³€μˆ˜κ°€ μ•„λ‹Œ "Thread.sleep()" λ‹€μŒκ³Ό 같이 μŠ€νƒœν‹± λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•΄μ•Ό ν•œλ‹€. 

     

    πŸ—οΈ interrupt()와 interrupted()

       μ§„ν–‰ 쀑인 μ“°λ ˆλ“œλ₯Ό μž‘μ—…μ΄ λλ‚˜κΈ° 전에 μ·¨μ†Œν•˜λŠ” 경우(e.g 예λ₯Ό λ“€μ–΄ νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œ ν•˜λ‹€κ°€ 쀑간에 μ·¨μ†Œν•˜λŠ” 경우)μ—λŠ” interruptλ₯Ό μ΄μš©ν•˜μ—¬ μž‘μ—…μ„ μ·¨μ†Œν•  수 μžˆλ‹€. 

    // μ“°λ ˆλ“œμ˜ interrupted μƒνƒœλ₯Ό falseμ—μ„œ true둜 λ³€κ²½ν•œλ‹€.
    void interrupt() 
    
    // μ“°λ ˆλ“œμ˜ interruptedμƒνƒœλ₯Ό λ°˜ν™˜ν•œλ‹€.
    boolean isInterrupted
    
    // ν˜„μž¬ μ“°λ ˆλ“œμ˜ interruptedμƒνƒœλ₯Ό λ°˜ν™˜ ν›„, false둜 λ³€κ²½ν•œλ‹€.
    static boolean interrupted()
    public class InterruptExample {
        public static void main(String[] args) {
            Thread myThread = new MyThread();
            myThread.start();
    
            try {
                Thread.sleep(2000); // 2μ΄ˆκ°„ λŒ€κΈ°
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            // μŠ€λ ˆλ“œ μΈν„°λŸ½νŠΈ
            myThread.interrupt();
        }
    }
    
    class MyThread extends Thread {
        public void run() {
            while (!isInterrupted()) {
                try {
                    System.out.println("μŠ€λ ˆλ“œ μ‹€ν–‰ 쀑");
                    Thread.sleep(500); // 0.5μ΄ˆκ°„ λŒ€κΈ°
                } catch (InterruptedException e) {
                    System.out.println("μΈν„°λŸ½νŠΈ λ°œμƒ");
                    // μŠ€λ ˆλ“œ μΈν„°λŸ½νŠΈ μƒνƒœλ₯Ό μ²΄ν¬ν•˜κ³  ν•„μš”ν•œ μž‘μ—… μˆ˜ν–‰
                    // 예: μžμ› 정리, μ’…λ£Œ λ“±
                    return; // μŠ€λ ˆλ“œ μ’…λ£Œ
                }
            }
        }
    }

     

    πŸ—οΈ  suspend(), resume()

       μœ„μ˜ μ„Έ λ©”μ†Œλ“œλŠ” μŠ€λ ˆλ“œλ₯Ό μΌμ‹œ μ •μ§€μ‹œν‚€κ³  μž¬κ°œμ‹œν‚€λŠ” κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€λ§Œ μ‚¬μš© μ‹œ ꡐ착 μƒνƒœμ™€ μŠ€λ ˆλ“œ 일관성 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€. λ”°λΌμ„œ ꢌμž₯λ˜μ§€ μ•ŠμœΌλ©°, wait(), notify(), Lockκ³Ό 같은 μŠ€λ ˆλ“œ 동기화 λ©”μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€. 

     

    πŸ—οΈ  yield()

       ν˜„μž¬ μ‹€ν–‰ 쀑인 μŠ€λ ˆλ“œλ₯Ό μΌμ‹œμ μœΌλ‘œ μ •μ§€ μ‹œν‚€κ³  λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ λ˜λ„λ‘ 양보(yield)ν•œλ‹€. 

    class MyThread extends Thread {
        private String name;
    
        public MyThread(String name) {
            this.name = name;
        }
    
        public void run() {
            for (int i = 1; i <= 5; i++) {
                System.out.println(name + ": " + i);
                // μŠ€λ ˆλ“œ μ‹€ν–‰ 쀑간에 λ‹€λ₯Έ μŠ€λ ˆλ“œμ—κ²Œ μ‹€ν–‰ 기회λ₯Ό 양보
                Thread.yield();
            }
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            MyThread thread1 = new MyThread("Thread 1");
            MyThread thread2 = new MyThread("Thread 2");
    
            thread1.start();
            thread2.start();
        }
    }

    μœ„μ˜ μ½”λ“œμ—μ„œλŠ” 두 개의 μ“°λ ˆλ“œκ°€ λ²ˆκ°ˆμ•„κ°€λ©° μ‹€ν–‰λ˜λŠ” 것을 확인할 수 μžˆλ‹€.

     

    πŸ—οΈ  join()

       ν˜ΈμΆœν•œ μŠ€λ ˆλ“œλŠ” join() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ μŠ€λ ˆλ“œκ°€ μ’…λ£Œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°ν•œλ‹€.

    public class JoinExample {
        public static void main(String[] args) {
            Thread thread1 = new Thread(new MyThread("Thread 1"));
            Thread thread2 = new Thread(new MyThread("Thread 2"));
            Thread thread3 = new Thread(new MyThread("Thread 3"));
    
            thread1.start();
            thread2.start();
            thread3.start();
    
            try {
                thread1.join(); // thread1이 μ’…λ£Œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°
                thread2.join(); // thread2κ°€ μ’…λ£Œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°
                thread3.join(); // thread3이 μ’…λ£Œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            System.out.println("메인 μŠ€λ ˆλ“œ μ’…λ£Œ");
        }
    }
    
    class MyThread implements Runnable {
        private String name;
    
        public MyThread(String name) {
            this.name = name;
        }
    
        public void run() {
            for (int i = 1; i <= 5; i++) {
                System.out.println(name + ": " + i);
                try {
                    Thread.sleep(1000); // 1μ΄ˆκ°„ λŒ€κΈ°
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    main λ©”μ„œλ“œλŠ” thread1,2,3κ°€ λͺ¨λ‘ 순차적으둜 μ‹€ν–‰λ˜κ³  μ’…λ£Œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°ν•˜κ²Œ λœλ‹€. 

    μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ λ³€κ²½κΈˆμ§€ (μƒˆμ°½μ—΄λ¦Ό)
      'JAVA' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
      • [Java] Volatile ν‚€μ›Œλ“œ
      • [Java] μ“°λ ˆλ“œμ˜ 동기화
      • [Java] Thread vs Runnable
      • [Java] μΈν„°νŽ˜μ΄μŠ€
      λ² μ–΄_
      λ² μ–΄_
      Today I learned | 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 개발자

      ν‹°μŠ€ν† λ¦¬νˆ΄λ°”