λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Study/Java

[TIL] μŠ€λ ˆλ“œ

by hong- 2022. 5. 22.

🀲🏻 μŠ€λ ˆλ“œ Thread

 - ν•˜λ‚˜μ˜ μ½”λ“œ μ‹€ν–‰ 흐름

πŸ“ λ©€ν‹° μŠ€λ ˆλ“œ Multi-Thread

  - ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ 두 κ°€μ§€ μ΄μƒμ˜ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λŠ” μŠ€λ ˆλ“œ

  - ν”„λ‘œμ„ΈμŠ€ ? λ™μž‘ν•˜κ³  μžˆλŠ” ν”„λ‘œκ·Έλž¨

  - ν”„λ‘œκ·Έλž¨ λ‚΄λΆ€μ—μ„œμ˜ λ©€ν‹° νƒœμŠ€ν‚Ή

  - 메인 μŠ€λ ˆλ“œκ°€ μ—†λ‹€λ©΄ λ©€ν‹°μŠ€λ ˆλ“œκ°€ λ‚˜μ˜¬ 수 μ—†μŒ

 

πŸ“ 메인 μŠ€λ ˆλ“œ Main-Thread

  - main() λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄μ„œ μ‹œμž‘λ¨

  - main()λ©”μ„œλ“œμ˜ 첫 μ½”λ“œλΆ€ν„° 순차적으둜 μ‹€ν–‰ν•˜κ³  λ§ˆμ§€λ§‰ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κ±°λ‚˜ returnλ¬Έ λ§Œλ‚˜λ©΄ μ’…λ£Œλ¨

  - λ©€ν‹° μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜μ—¬ λ©€ν‹° νƒœμŠ€ν‚Ή μˆ˜ν–‰ κ°€λŠ₯

  - μž‘μ—… 쀑 ν•„μš”μ— 따라 μŠ€λ ˆλ“œλ“€μ„ λ§Œλ“€μ–΄ λ³‘λ ¬λ‘œ μ½”λ“œ μ‹€ν–‰ κ°€λŠ₯

πŸ’‘ ExecutorService 라이브러리

  - 병렬 μž‘μ—… μ‹œ μ—¬λŸ¬ 개의 μž‘μ—…μ„ 효율적으둜 μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ œκ³΅λ˜λŠ” 라이브러리

  - 각각 λ‹€λ₯Έ threadλ₯Ό μƒμ„±ν•˜μ—¬ μž‘μ—…μ„ μ²˜λ¦¬ν•˜κ³  μ²˜λ¦¬κ°€ μ™„λ£Œλ˜λ©΄ ν•΄λ‹Ή threadλ₯Ό μ œκ±°ν•˜λŠ” μž‘μ—…μ„ μ§„ν–‰


πŸ‘πŸ» Thread 생성과 μ‹€ν–‰

πŸ“ μž‘μ—… μŠ€λ ˆλ“œ 생성

  - λͺ‡ 개의 μž‘μ—…μ„ μ‹€ν–‰ν• μ§€ κ²°μ •ν•˜κ³  각 μž‘μ—…λ³„λ‘œ μŠ€λ ˆλ“œ 생성

     → 메인은 λ°˜λ“œμ‹œ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— 좔가적인 병렬 μž‘μ—… 수만큼 μŠ€λ ˆλ“œ 생성

     → μž‘μ—… μŠ€λ ˆλ“œλ„ 객체둜 μƒμ„±λ˜κΈ° λ•Œλ¬Έμ— 좔가적인 클래슀 ν•„μš”

 β–ͺ️ Thread ν΄λž˜μŠ€λ‘œλΆ€ν„° 직접 생성

 β‘  μŠ€λ ˆλ“œ 객체 생성

Thread thread = new Thread(Runnable target);

  - java.lang.Thread ν΄λž˜μŠ€λ‘œλΆ€ν„° μž‘μ—… μŠ€λ ˆλ“œ 객체λ₯Ό 직접 μƒμ„±ν•˜λ €λ©΄ Runnable을 λ§€κ°œλ³€μˆ˜λ‘œ κ°–λŠ” μƒμ„±μž 호좜이 ν•„μš”

β‘‘ Runnable λ§€κ°œλ³€μˆ˜λ‘œ μƒμ„±μž 호좜

class Task implements Runnable({
	public void run(){
       μ‹€ν–‰ν•  μ½”λ“œ;
    }
}

  πŸ’‘ Runnable  

   - μž‘μ—… μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ν•  수 μžˆλŠ” μ½”λ“œλ₯Ό κ°€μ§„ μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ κ΅¬ν˜„ 객체λ₯Ό λ§Œλ“€μ–΄ λŒ€μž…ν•΄μ•Ό 함

   - λ©”μ„œλ“œ run( )이 μ •μ˜λ˜μ–΄μžˆμŒ → run ( )을 μž¬μ •μ˜ ν•˜μ—¬ μ‹€ν–‰ν•  μ½”λ“œ μž‘μ„±

   - μ‹€μ œ μŠ€λ ˆλ“œκ°€ μ•„λ‹ˆλΌ μž‘μ—… λ‚΄μš©μ„ κ°€μ§€κ³  μžˆλŠ” 객체일 뿐 !

Runnable task = new Task();
Thread thread = new Thread(task);

   - Runnable κ΅¬ν˜„ 객체λ₯Ό μƒμ„±ν•œ ν›„ 이것을 맀개 κ°’μœΌλ‘œ Thread μƒμ„±μž ν˜ΈμΆœν•˜λ©΄ → μž‘μ—…μŠ€λ ˆλ“œ 생성 !

  πŸ’‘ Runnable 읡λͺ…객체λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ μ‚¬μš©

Thread thread = new Thread(new Runnable() {
	public void run(){
    	μ‹€ν–‰ν•  μ½”λ“œ;
    }
});

  πŸ’‘ λžŒλ‹€μ‹μ„ λ§€κ°œλ³€μˆ˜λ‘œ μ‚¬μš©

Thread thread = new Thread( () -> {
	μ‹€ν–‰ν•  μ½”λ“œ;
});

β‘’ start( ) λ©”μ†Œλ“œ 호좜

  - μž‘μ—… μŠ€λ ˆλ“œλŠ” 생성이 λ˜λ”λΌλ„ start( )λ₯Ό ν˜ΈμΆœν•΄μ•Όλ§Œ μ‹€ν–‰

  - start( )κ°€ 호좜되면 μž‘μ—… μŠ€λ ˆλ“œλŠ” λ§€κ°œλ³€μˆ˜λ‘œ 받은 Runnable의 run( )을 μ‹€ν–‰ν•˜λ©° μž‘μ—… 처리


β–ͺ️ Thread ν•˜μœ„ ν΄λž˜μŠ€λ‘œλΆ€ν„° 생성 (상속)

 β‘   μŠ€λ ˆλ“œ 객체 생성

public class Target extends Thread {
    @Override
	public void run() {
    	μ‹€ν–‰μ½”λ“œ;
    }
}

 - Thread의 ν•˜μœ„ν΄λž˜μŠ€λ‘œ μž‘μ—… μŠ€λ ˆλ“œλ₯Ό μ •μ˜

 - 상속 ν›„ run( )을 μž¬μ •μ˜ν•˜μ—¬ μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ν•  μ½”λ“œ μž‘μ„±

β‘‘ μŠ€λ ˆλ“œ 객체

Thread thread = new Target();

   πŸ’‘Thread 읡λͺ… 객체둜 μž‘μ—… μŠ€λ ˆλ“œ 객체 생성

Thread thread = new Thread() {
	public void run() {
    	μ‹€ν–‰ν•  μ½”λ“œ;
    }
}

β‘’ start( ) λ©”μ†Œλ“œ 호좜

thread.start();

πŸ“ μŠ€λ ˆλ“œμ˜ 이름

thread.setName("μŠ€λ ˆλ“œ 이름");
thread.getName();

  - Thread의 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ → μŠ€λ ˆλ“œ 객체 μ°Έμ‘° ν•„μš”

 

  πŸ’‘ currentThread( )

     : ν˜„μž¬ μ‹€ν–‰ 쀑이 μŠ€λ ˆλ“œ 객체 리턴


πŸ‘ŒπŸ» Thread 동기화 및 μƒνƒœ

πŸ“ 동기화 λ©”μ„œλ“œμ™€ 동기화 블둝

(1) λ©”μ„œλ“œμ— μ‚¬μš©
 public synchronized void method() { }
 
(2) 객체에 μ‚¬μš©
 private Objcet obj = new Object();
 public void Method(){synchronized(obj){}}

 - μž„κ³„μ˜μ—­μ„ μ§€μ •ν•˜μ—¬ λ©€ν‹° μŠ€λ ˆλ“œμ˜ 데이터 μ•ˆμ •μ„±κ³Ό 신뒰성을 보μž₯

 - μ‹±κΈ€ μŠ€λ ˆλ“œμ™€ 달리 λ©€ν‹° μŠ€λ ˆλ“œλŠ” μž‘μ—… 곡간을 μŠ€λ ˆλ“€λΌλ¦¬ κ³΅μœ ν•¨

 - μŠ€λ ˆλ“œκ°€ μ‚¬μš©μ€‘μΈ 객체λ₯Ό λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ λ³€κ²½ν•  수 없도둝 ν•˜λ €λ©΄ μž‘μ—…μ΄ μ’…λ£Œλ  λ•ŒκΉŒμ§€ 객체에 μž κΈˆμ„ 걸어두어야 함

  * μž„κ³„μ˜μ—­ : λ©€ν‹° μŠ€λ ˆλ“œμ—μ„œ 단 ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ§Œ μ‹€ν–‰ν•  수 μžˆλŠ” μ˜μ—­


πŸ“ μŠ€λ ˆλ“œμ˜ μƒνƒœ

πŸ’‘ getState( )

  - μŠ€λ ˆλ“œμ˜ μƒνƒœλ₯Ό μ•Œ 수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” λ©”μ†Œλ“œ


πŸ“ μŠ€λ ˆλ“œ μƒνƒœ μ œμ–΄

 - μ‹€ν–‰ 쀑이 μŠ€λ ˆλ“œ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” 것

β‘  yiled( ) : 양보

  - μš°μ„ μˆœμœ„κ°€ λ™μΌν•œ μ‹€ν–‰ 쀑인 μŠ€λ ˆλ“œκ°€ λ‹€λ₯Έ μŠ€λ ˆλ“œμ—κ²Œ μ–‘λ³΄ν•˜κ³  μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‘œ 이동

  - μŠ€λ ˆλ“œκ°€ μž‘μ—…μ„ μ²˜λ¦¬ν•  λ•Œ λ¬΄μ˜λ―Έν•œ λ°˜λ³΅μ„ λ‹€λ₯Έ μŠ€λ ˆλ“œμ— μ–‘λ³΄ν•˜μ—¬ μ„±λŠ₯ κ°œμ„ 

β‘‘ sleep( ) : μΌμ‹œ μ •μ§€

  - μ£Όμ–΄μ§„ μ‹œκ°„ λ™μ•ˆ μŠ€λ ˆλ“œλ₯Ό μΌμ‹œ μ •μ§€ μƒνƒœλ‘œ λ§Œλ“¦

  - μ‹œκ°„μ΄ μ§€λ‚˜λ©΄ μžλ™μ μœΌλ‘œ μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‘œ 이동

try{
	Thread.sleep(3000);
} catch (InterruptedException e){
}

  - 맀개 κ°’μœΌλ‘œλŠ” μ–Όλ§ˆλ‚˜ μ •μ§€μƒνƒœμ— μžˆμ„μ§€ λ°€λ¦¬μ„Έμ»¨λ“œ λ‹¨μœ„μ˜ μ‹œκ°„ (1000 = 1초)

  - μ£Όμ–΄μ§„ μ‹œκ°„ μ „ interrupt( )κ°€ 호좜되면 interrupt μ˜ˆμ™Έκ°€ λ°œμƒν•˜κΈ° λ•Œλ¬Έμ— μ˜ˆμ™Έμ²˜λ¦¬ ν•„μš”ν•¨

β‘’ join( ) : κΈ°λ‹€λ¦Ό

[Thread A]
threadB.start();   -----> ThreadBκ°€ μ‹€ν–‰λ˜κ³ 
threadB.join();    -----> ThreadAλŠ” μΌμ‹œμ •μ§€

  - μΌμ‹œ μ •μ§€ μƒνƒœκ°€ 됨

  - λ©”μ„œλ“œλ₯Ό λ©€λ²„λ‘œ κ°€μ§€λŠ” μŠ€λ ˆλ“œκ°€ μ’…λ£Œλ˜κ±°λ‚˜ λ§€κ°œκ°’μœΌλ‘œ μ£Όμ–΄μ§„ μ‹œκ°„μ΄ μ’…λ£Œλ˜λ©΄ μ‹€ν–‰λŒ€κΈ° μƒνƒœλ‘œ 이동

β‘£ wait( ) : ν˜‘μ—…

  - 동기화 블둝 λ‚΄μ—μ„œ μŠ€λ ˆλ“œλ₯Ό μΌμ‹œ μ •μ§€ μƒνƒœλ‘œ λ§Œλ“¦

  - λ§€κ°œκ°’μœΌλ‘œ μ£Όμ–΄μ§„ μ‹œκ°„μ΄ μ§€λ‚˜λ©΄ μžλ™μœΌλ‘œ μ‹€ν–‰ λŒ€κΈ° μƒνƒœ 이동

  - μ£Όμ–΄μ§„ μ‹œκ°„μ΄ 없을 땐 notify, notifyAll ν™œμš©

β‘€ notify( ) / notifyAll( ) : ν˜‘μ—…

  - wait( )에 μ˜ν•΄ μΌμ‹œ μ •μ§€ μƒνƒœμ— μžˆλŠ” μŠ€λ ˆλ“œλ₯Ό μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‘œ 이동

  - notify( )λŠ” wait에 μ˜ν•΄ μΌμ‹œμ •μ§€λœ μŠ€λ ˆλ“œ 쀑 ν•œ 개λ₯Ό μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‘œ λ§Œλ“¦

  - notifyAll( )은 μΌμ‹œμ •μ§€λœ λͺ¨λ“  μŠ€λ ˆλ“œλ₯Ό μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‘œ λ§Œλ“¦

  - wait, notify, notifyAll은 λͺ¨λ‘ Object클래슀라 λͺ¨λ“  곡유 κ°μ²΄μ—μ„œ 호좜이 κ°€λŠ₯함

    → but 동기화 λ©”μ„œλ“œ / 블둝 λ‚΄μ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯

β‘₯ interrupt


πŸ™ŒπŸ» Thread ν’€

 - μŠ€λ ˆλ“œμ˜ λ¬΄λΆ„λ³„ν•œ 증가λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ μŠ€λ ˆλ“œ ν’€ μ‚¬μš©

 - μž‘μ—…μ— μ‚¬μš©λ˜λŠ” μŠ€λ ˆλ“œμ˜ 수λ₯Ό 미리 정해놓아 λ™μ‹œμ— μž‘μ—… μˆ˜ν–‰

 - μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μž‘μ—…μ΄ 큐둜 λ“€μ–΄μ˜€λ©΄ μŠ€λ ˆλ“œ ν’€ μ•ˆμ˜ μŠ€λ ˆλ“œλ“€μ΄ ν•˜λ‚˜μ”© μž‘μ—…μ΄ λλ‚˜λ©΄ μƒˆλ‘œμš΄ μž‘μ—…μ„ 맑으며 처리

πŸ“ μŠ€λ ˆλ“œν’€ 생성

β‘  newCachedThreadPool( )

 - 초기 μŠ€λ ˆλ“œ 수 : 0

 - μ½”μ–΄ μŠ€λ ˆλ“œ 수 : 0

 - μ΅œλŒ€ μŠ€λ ˆλ“œ 수 : integer.Max_value

β‘‘ newFixedThreadPool(int num)

 - 초기 μŠ€λ ˆλ“œ 수 : 0

 - μ½”μ–΄ μŠ€λ ˆλ“œ 수 : num

 - μ΅œλŒ€ μŠ€λ ˆλ“œ 수 : num

πŸ“ μŠ€λ ˆλ“œν’€ μ’…λ£Œ

β‘  shutdown( ) 

  - 큐에 λ‚¨μ•„μžˆλŠ” λͺ¨λ“  μž‘μ—…μ„ μ²˜λ¦¬ν•˜κ³  μ’…λ£Œ

β‘‘ shutdownNow( )

  - λ‚¨μ•„μžˆλŠ” μž‘μ—…κ³Ό 상관없이 μ’…λ£Œ

  - 처리 λͺ»ν•œ μž‘μ—… λͺ©λ‘μ„ 리턴 = Runnable μƒνƒœλ“€μ˜ μž‘μ—… 리턴

β‘’ awaitTermination( )

  - shotdown( ) 호좜 ν›„ λͺ¨λ“  μž‘μ—… 처리λ₯Ό timeout μ‹œκ°„ μ•ˆμ— μ²˜λ¦¬ν•˜λ©΄ true

  - μ²˜λ¦¬ν•˜μ§€ λͺ»ν•˜λ©΄ μž‘μ—… μŠ€λ ˆλ“œλ“€μ„ interrupt( )ν•˜κ³  false

'Study > Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[TIL] μž¬κ·€ν•¨μˆ˜  (0) 2022.05.24
[TIL] μžλ°” 가상 λ¨Έμ‹   (0) 2022.05.22
[TIL] 파일 μž…μΆœλ ₯  (0) 2022.05.21
[TIL] 슀트림  (0) 2022.05.21
[TIL] λžŒλ‹€  (0) 2022.05.20