🌏 WEB/JAVA

λ‚΄κ°€ 보렀고 μ •λ¦¬ν•˜λŠ” JAVA λ©€ν‹° μŠ€λ ˆλ“œ 3- μŠ€λ ˆλ“œ μƒνƒœ

μ• μ •μ“° 2021. 10. 5. 01:41

μŠ€λ ˆλ“œλŠ” μ‹€ν–‰λŒ€κΈ° μƒνƒœμ™€ μ‹€ν–‰ μƒνƒœλ₯Ό λ²ˆκ°ˆμ•„κ°€λ©΄μ„œ μžμ‹ μ˜ run() λ©”μ„œλ“œλ₯Ό μ‘°κΈˆμ”© μ‹€ν–‰ν•©λ‹ˆλ‹€.

κ·Έ ν›„ 더이상 μ‹€ν–‰ν•  μ½”λ“œκ°€ 없을 λ•Œ μ’…λ£Œ μƒνƒœκ°€ λ©λ‹ˆλ‹€.

 

μŠ€λ ˆλ“œ 객체 생성 -> start() -> μ‹€ν–‰λŒ€κΈ°(μŠ€μΌ€μ€„λ§μœΌλ‘œ 인해) <-> μ‹€ν–‰ -> μ’…λ£Œ

 

- μŠ€λ ˆλ“œ μŠ€μΌ€μ€„λ§μœΌλ‘œ μ„ νƒλœ μŠ€λ ˆλ“œκ°€ cpuλ₯Ό μ μœ ν•˜κ³  run() λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•œλ‹€ (μ‹€ν–‰ μƒνƒœ)

- μŠ€λ ˆλ“œ μŠ€μΌ€μ€„λ§μ— μ˜ν•΄ λ‹€μ‹œ μ‹€ν–‰λŒ€κΈ° μƒνƒœλ‘œ λŒμ•„κ°ˆ 수 μžˆλ‹€.(μ‹€ν–‰λŒ€κΈ° μƒνƒœ)

 

μ–΄λ–»κ²Œ μ œμ–΄ν• κΉŒ?

 

1. 주어진 μ‹œκ°„λ™μ•ˆ μΌμ‹œ 정지 sleep()

 

μ‹€ν–‰ 쀑인 μŠ€λ ˆλ“œλ₯Ό 일정 μ‹œκ°„ 멈좜 수 있게 ν•œλ‹€.

Thread 클래슀의 정적 λ©”μ„œλ“œμΈ sleep() 을 μ‚¬μš©ν•œλ‹€.

Thread.sleep(1000) // 1초 -> λ°€λ¦¬μ„Έμ»¨λ“œ (1/1000) λ‹¨μœ„

 

* 주어진 μ‹œκ°„μ΄ λ˜κΈ°μ „μ— interrupt() λ©”μ„œλ“œκ°€ 호좜되면 InterruptedException λ°œμƒ! (μ˜ˆμ™Έ 처리 ν•„μš”)

 

2. λ‹€λ₯Έ μŠ€λ ˆλ“œμ—κ²Œ μ‹€ν–‰ 양보 yield()

 

Thread.yield();

이 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ μŠ€λ ˆλ“œλŠ” μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‘œ λŒμ•„κ°€κ³  λ™μΌν•œ μš°μ„ μˆœμœ„ or 높은 μš°μ„ μˆœμœ„λ₯Ό κ°–λŠ” λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ 기회λ₯Ό κ°€μ§ˆ 수 μžˆλ„λ‘ ν•΄μ€€λ‹€.

 

3. λ‹€λ₯Έ μŠ€λ ˆλ“œμ— μ’…λ£Œ κΈ°λ‹€λ¦Ό join()

 

μŠ€λ ˆλ“œλŠ” λ‹€λ₯Έ μŠ€λ ˆλ“œμ™€ λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” 것이 κΈ°λ³Έμ΄μ§€λ§Œ λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ μ‹€ν–‰λ˜μ–΄ μ’…λ£Œλ λ•Œ κΉŒμ§€ κΈ°λ‹€λ¦¬λŠ” κ²½μš°λ„ μžˆλ‹€.

예λ₯Όλ“€μ–΄ λ‹€λ₯Έ μŠ€λ ˆλ“œμ˜ 계산값을 λ°›μ•„ μ΄μš©ν•˜λŠ” κ²½μš°κ°€ 이에 ν•΄λ‹Ήν•œλ‹€. 

 

public static void main(String[] args){
	SumThread sumThread = new SumThread();
    sumThread.start();
    
    try{
    	sumThread.join():
	}cath(InterruptedException e){
	}
	}  
}

sumThread.join(); μ—μ„œ sumThreadκ°€ ν•˜λŠ” 일이 λͺ¨λ‘ μ’…λ£Œλ  λ•Œ κΉŒμ§€ main μŠ€λ ˆλ“œλ₯Ό μΌμ‹œμ •μ§€ μ‹œν‚¨λ‹€.

 

4. μŠ€λ ˆλ“œ κ°„ ν˜‘μ—… wait(), notify(), notifyAll()

 

두 개의 μŠ€λ ˆλ“œλ₯Ό λ²ˆκ°ˆμ•„κ°€λ©° μ‹€ν–‰ν•΄μ•Ό ν•  κ²½μš°κ°€ μžˆλ‹€.

방법은 κ³΅μœ κ°μ²΄μ— μžˆλ‹€ μŠ€λ ˆλ“œκ°€ μž‘μ—…ν•  λ‚΄μš©μ„ 각각 동기화 λ©”μ„œλ“œλ‘œ ꡬ뢄해 놓고 ν•œ μŠ€λ ˆλ“œκ°€ μ™„λ£Œν•˜λ©΄ notify() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ„œ

μΌμ‹œ 정지 μƒνƒœμ— μžˆλŠ” λ‹€λ₯Έ μŠ€λ ˆλ“œλ₯Ό μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‘œ λ§Œλ“€μ–΄ μžμ‹ μ€ λ‘λ²ˆ μž‘μ—…ν•˜μ§€ μ•Šλ„λ‘ wait() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μΌμ‹œ 정지 μƒνƒœλ‘œ λ§Œλ“ λ‹€.

 

5. μŠ€λ ˆλ“œμ˜ μ•ˆμ „ν•œ μ’…λ£Œ stop ν”Œλž˜κ·Έ, interrept()

 

μŠ€λ ˆλ“œλŠ” μžμ‹ μ˜ run() λ©”μ„œλ“œκ°€ λͺ¨λ‘ μ‹€ν–‰λ˜λ©΄ μžλ™μ μœΌλ‘œ μ’…λ£Œλœλ‹€. 

κ²½μš°μ— 따라 κ°•μ œ μ’…λ£Œν•  ν•„μš”κ°€ μžˆλ‹€. stop() λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜κ³  μžˆμ—ˆμ§€λ§Œ κ°•μ œ μ’…λ£Œν•˜κ²Œ 되면 μ‚¬μš©μ€‘μΈ μžμ›λ“€μ΄ λΆˆμ•ˆμ •ν•œ μƒνƒœλ‘œ 남겨지기 λ•Œλ¬Έμ— deprecated λ˜μ—ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ μ•„λž˜μ™€ 같은 방법을 μ‚¬μš©ν•˜λ©΄ λœλ‹€.

 

1. stop ν”Œλž˜κ·Έλ₯Ό μ΄μš©ν•œλ‹€.

 

stop ν”Œλž˜κ·Έλ₯Ό μ΄μš©ν•΄μ„œ run() λ©”μ„œλ“œμ˜ μ’…λ£Œλ₯Ό μœ λ„ν•˜λŠ” 방법이닀.

private boolean stop // stop ν”Œλž˜κ·Έ ν•„λ“œ

public void run(){
	while(!stop){ // stop이 trueκ°€ 되면 run()이 μ’…λ£Œλœλ‹€.
    	반볡 μ‹€ν–‰λ˜λŠ” μ½”λ“œ
		}
    // μžμ› 정리
	}
}

 

2. interrupt() λ©”μ„œλ“œλ₯Ό μ΄μš©ν•œλ‹€.

 

μŠ€λ ˆλ“œκ°€ μΌμ‹œ 정지 μƒνƒœμ— μžˆμ„ λ•Œ InterruptedException μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” 역할을 ν•œλ‹€.

whileλ¬Έμ•ˆμ—μ„œ sleep() λ©”μ„œλ“œλ‘œ μΌμ‹œ 정지λ₯Ό μ‹œν‚€κ²Œ 되면 InterruptedExcetion이 λ°œμƒν•˜μ—¬ while문을 λΉ μ Έλ‚˜μ™€ run() λ©”μ„œλ“œλ₯Ό 정상 μ’…λ£Œν•œλ‹€.

thraed.interrupt()


//////////


while(true){
	if(Thread.interrupted()){
    	break;
       }
	}

-> aμ—μ„œ thread.interrupt()λ₯Ό μ‚¬μš©ν•˜μ—¬ bκ°€ λ©ˆμΆ”λ„λ‘ ν•œλ‹€.

bλŠ” if문을 μ‚¬μš©ν•˜μ—¬ interrupt()의 호좜 μ—¬λΆ€λ₯Ό ν™•μΈν•˜κ³  while문을 λΉ μ Έλ‚˜μ˜€λ©΄μ„œ run() λ©”μ„œλ“œ μ’…λ£Œ

λ°˜μ‘ν˜•