[JAVA] μŠ€λ ˆλ“œ

2021. 4. 17. 16:34Β·πŸ“ Language/✏ JAVA

μŠ€λ ˆλ“œ

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λ©΄ μš΄μ˜μ²΄μ œλ‘œλΆ€ν„° 싀행에 ν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›λŠ”λ°,
μ‹€ν–‰ 쀑인 ν•˜λ‚˜μ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ν”„λ‘œμ„ΈμŠ€λΌ ν•˜κ³ 
ν”„λ‘œμ„ΈμŠ€ λ‚΄λΆ€μ—μ„œ μ½”λ“œμ˜ μ‹€ν–‰ 흐름을 μŠ€λ ˆλ“œλΌ ν•œλ‹€.

 

1. λ©€ν‹° μŠ€λ ˆλ“œ

μš΄μ˜μ²΄μ œλŠ” λ©€ν‹° νƒœμŠ€ν‚Ήμ„ ν•  수 μžˆλ„λ‘ CPU 및 λ©”λͺ¨λ¦¬ μžμ›μ„ ν”„λ‘œμ„ΈμŠ€λ§ˆλ‹€ 적절히 ν• λ‹Ήν•΄μ£Όκ³  λ³‘λ ¬λ‘œ μ‹€ν–‰μ‹œν‚¨λ‹€.

 

μ΄λ•Œ λ©€ν‹° νƒœμŠ€ν‚Ήμ΄ κΌ­ λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λ₯Ό λœ»ν•˜λŠ” 것은 μ•„λ‹ˆλ‹€. λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λŠ” ν•˜λ‚˜ μ΄μƒμ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ™μ‹œμ— 병렬 μ²˜λ¦¬ν•˜λŠ” 것을 λ§ν•œλ‹€. ν•˜λ‚˜μ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λ₯Ό λ§Œλ“€κΈ°λ„ ν•œλ‹€. 예λ₯Ό λ“€μ–΄ μ–΄λ–€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 2개 μ‹€ν–‰ν–ˆλ‹€λ©΄ 2개의 ν”„λ‘œμ„ΈμŠ€κ°€ μƒμ„±λœ 것이닀.

 

ν•œ ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ λ©€ν‹° νƒœμŠ€ν‚Ήμ„ ν•  수 μžˆλ„λ‘ λ§Œλ“€μ–΄μ§„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜λ„ μžˆλ‹€. λŒ€ν‘œμ μœΌλ‘œ λ―Έλ””μ–΄ ν”Œλ ˆμ΄μ–΄λŠ” λ™μ˜μƒ μž¬μƒκ³Ό μŒμ•… μž¬μƒμ΄λΌλŠ” 두 κ°€μ§€ μž‘μ—…μ„ λ™μ‹œμ— μ²˜λ¦¬ν•œλ‹€.

 

μ–΄λ–»κ²Œ ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ 두 κ°€μ§€ μ΄μƒμ˜ μž‘μ—…μ„ μ²˜λ¦¬ν• κΉŒ?

λ°”λ‘œ λ©€ν‹° μŠ€λ ˆλ“œλ₯Ό μ΄μš©ν•˜λ©΄ λœλ‹€. ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλŠ” ν•˜λ‚˜μ˜ μ½”λ“œ μ‹€ν–‰ 흐름이기 λ•Œλ¬Έμ— ν•œ ν”„λ‘œμ„ΈμŠ€ 내에 μŠ€λ ˆλ“œκ°€ 2개라면 2개의 μ½”λ“œ μ‹€ν–‰ 흐름이 μƒκΈ΄λ‹€λŠ” μ˜λ―Έμ΄λ‹€.

 

λ©€ν‹° ν”„λ‘œμ„ΈμŠ€μ™€ λ©€ν‹° μŠ€λ ˆλ“œ

 

λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λŠ” μš΄μ˜μ²΄μ œμ—μ„œ 할당받은 μžμ‹ μ˜ λ©”λͺ¨λ¦¬λ₯Ό κ°€μ§€κ³  μ‹€ν–‰ν•˜κΈ° λ•Œλ¬Έμ— κ° ν”„λ‘œμ„ΈμŠ€λŠ” 독립적이닀. λ”°λΌμ„œ ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€μ—μ„œ 였λ₯˜κ°€ λ°œμƒν•΄λ„ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ”λ‹€. ν•˜μ§€λ§Œ λ©€ν‹° μŠ€λ ˆλ“œλŠ” ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ 내뢀에 μƒμ„±λ˜κΈ° λ•Œλ¬Έμ— ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ μ˜ˆμ™Έλ₯Ό λ°œμƒν•˜λ©΄ ν”„λ‘œμ„ΈμŠ€ μžμ²΄κ°€ μ’…λ£Œλ  수 μžˆμ–΄ λ‹€λ₯Έ μŠ€λ ˆλ“œμ— 영ν–₯을 미치게 λœλ‹€.

 

1) 메인 μŠ€λ ˆλ“œ

μžλ°”μ˜ λͺ¨λ“  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 메인 μŠ€λ ˆλ“œκ°€ main() λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•˜λ©° μ‹œμž‘λœλ‹€. main()의 첫 μ½”λ“œλΆ€ν„° μ•„λž˜λ‘œ 순차적으둜 μ‹€ν–‰ν•˜κ³  λ§ˆμ§€λ§‰ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κ±°λ‚˜ return 문을 λ§Œλ‚˜λ©΄ 싀행이 μ’…λ£Œλœλ‹€.

 

메인 μŠ€λ ˆλ“œλŠ” ν•„μš”μ— 따라 μž‘μ—… μŠ€λ ˆλ“œλ“€μ„ λ§Œλ“€μ–΄ λ³‘λ ¬λ‘œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  수 μžˆλ‹€. μ¦‰, λ©€ν‹° μŠ€λ ˆλ“œλ‘œ λ©€ν‹° νƒœμŠ€ν‚Ήμ„ μˆ˜ν–‰ν•  수 μžˆλ‹€. λ©€ν‹° μŠ€λ ˆλ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” μ‹€ν–‰ 쀑인 μŠ€λ ˆλ“œκ°€ ν•˜λ‚˜λΌλ„ μžˆλ‹€λ©΄ ν”„λ‘œμ„ΈμŠ€λŠ” μ’…λ£Œλ˜μ§€ μ•ŠλŠ”λ‹€.

 

메인 μŠ€λ ˆλ“œ

 

2) μž‘μ—… μŠ€λ ˆλ“œ 생성과 μ‹€ν–‰

메인 μŠ€λ ˆλ“œλŠ” λ°˜λ“œμ‹œ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— 메인 μž‘μ—… 이외에 좔가적인 병렬 μž‘μ—…μ˜ 수만큼 μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•œλ‹€.

Thread thread = new Thread(); // μž‘μ—… μŠ€λ ˆλ“œ 생성
thread.start(); // μž‘μ—… μŠ€λ ˆλ“œ μ‹€ν–‰

// 1. Thread ν΄λž˜μŠ€λ‘œλΆ€ν„° 직접 생성
// Runnable은 μž‘μ—… μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ν•  수 μžˆλŠ” μ½”λ“œλ₯Ό κ°€μ§€κ³  μžˆλŠ” 객체둜
// μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ΄κΈ° λ•Œλ¬Έμ— κ΅¬ν˜„ 객체λ₯Ό λ§Œλ“€μ–΄ λŒ€μž…ν•΄μ•Ό ν•œλ‹€.

// 1) Runnable κ΅¬ν˜„ 클래슀
class Task implements Runnable {
	public void run() {
		// μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ν•  μ½”λ“œ
	}
}

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

// 2) 읡λͺ… κ΅¬ν˜„ 객체
Thread thread = new Thread(new Runnable() {
	public void run() {
		// μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ν•  μ½”λ“œ
	}
});

// 2. Thread ν•˜μœ„ ν΄λž˜μŠ€λ‘œλΆ€ν„° 생성
// Thread 클래슀λ₯Ό μƒμ†ν•œ ν›„ run() λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ν•œλ‹€.

// 1) ν•˜μœ„ 클래슀
class WorkerThread extends Thread {
	@override
	public void run() {
		// μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ν•  μ½”λ“œ
	}
}

Thread thread = new WorkerThread();

// 2) 읡λͺ… μžμ‹ 객체
Thread thread = new Thread {
	public void run() {
		// μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ν•  μ½”λ“œ
	}
});

 

3) 동기화 λ©”μ„œλ“œ

λ©€ν‹° μŠ€λ ˆλ“œ ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” μŠ€λ ˆλ“œλ“€μ΄ 객체λ₯Ό κ³΅μœ ν•΄μ„œ μž‘μ—…ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€. μ΄λ•Œ, μŠ€λ ˆλ“œκ°€ μ‚¬μš© 쀑인 객체λ₯Ό λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ λ³€κ²½ν•  수 없도둝 μŠ€λ ˆλ“œ μž‘μ—…μ΄ 끝날 λ•ŒκΉŒμ§€ κ°μ²΄μ— μž κΈˆμ„ κ±Έμ–΄μ„œ λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ μ‚¬μš©ν•  수 없도둝 ν•΄μ•Ό ν•œλ‹€.

 

동기화 λ©”μ„œλ“œ(synchronized)λŠ” λ©”μ„œλ“œ 전체 λ‚΄μš©μ΄ μž„κ³„ μ˜μ—­μ΄λ‹€.

  • 동기화 λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” μ¦‰μ‹œ 잠금이 μΌμ–΄λ‚˜κ³  μŠ€λ ˆλ“œκ°€ 동기화 λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ μ’…λ£Œν•˜λ©΄ 잠금이 ν’€λ¦°λ‹€.
  • 동기화 λ©”μ„œλ“œκ°€ μ—¬λŸ¬ 개 μžˆμ„ 경우, μŠ€λ ˆλ“œκ°€ 이듀 쀑 ν•˜λ‚˜λ₯Ό μ‹€ν–‰ν•  λ•Œ λ‹€λ₯Έ μŠ€λ ˆλ“œλŠ” ν•΄λ‹Ή λ©”μ„œλ“œλŠ” 물둠이고 λ‹€λ₯Έ 동기화 λ©”μ„œλ“œλ„ μ‹€ν–‰ν•  수 μ—†λ‹€.
  • λ‹€λ₯Έ μŠ€λ ˆλ“œλŠ” μ‚¬μš© 쀑인 μŠ€λ ˆλ“œκ°€ μž κΈˆμ„ ν•΄μ œν•  λ•ŒκΉŒμ§€ λŒ€κΈ°ν•΄μ•Ό ν•œλ‹€.
public synchronized void method(){
	// μž„κ³„ μ˜μ—­: 단 ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ§Œ μ‹€ν–‰
}

 

2. μŠ€λ ˆλ“œ μ œμ–΄

1) μŠ€λ ˆλ“œ μƒνƒœ

 

μŠ€λ ˆλ“œ μƒνƒœ λ³€ν™”

 

  1. μŠ€λ ˆλ“œ 객체λ₯Ό μƒμ„±ν•˜κ³  start() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ λ°”λ‘œ μ‹€ν–‰λ˜λŠ” 것이 μ•„λ‹ˆλΌ μ‹€ν–‰ λŒ€κΈ° μƒνƒœκ°€ λœλ‹€.
  2. μ΄λ•Œ μš΄μ˜μ²΄μ œλŠ” μ‹€ν–‰ λŒ€κΈ° μƒνƒœμ— μžˆλŠ” μŠ€λ ˆλ“œ μ€‘μ—μ„œ ν•˜λ‚˜λ₯Ό 선택해 μ‹€ν–‰ μƒνƒœλ‘œ λ§Œλ“ λ‹€.
  3. μ‹€ν–‰ μƒνƒœμ˜ μŠ€λ ˆλ“œλŠ” run() λ©”μ„œλ“œλ₯Ό λͺ¨λ‘ μ‹€ν–‰ν•˜κΈ° 전에 λ‹€μ‹œ μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‘œ λŒμ•„κ°ˆ 수 μžˆλ‹€.
  4. μ‹€ν–‰ μƒνƒœμ—μ„œ run() λ©”μ„œλ“œμ˜ λ‚΄μš©μ΄ λͺ¨λ‘ μ‹€ν–‰λ˜λ©΄ μŠ€λ ˆλ“œμ˜ 싀행이 λ©ˆμΆ”κ³  μ’…λ£Œ μƒνƒœκ°€ λœλ‹€.

 

2) μŠ€λ ˆλ“œ μƒνƒœ μ œμ–΄

λ©”μ„œλ“œλ₯Ό 톡해 μ‹€ν–‰ 쀑인 μŠ€λ ˆλ“œμ˜ μƒνƒœλ₯Ό λ³€ν™”μ‹œν‚¬ 수 μžˆλ‹€.

  • interrupt(): μΌμ‹œ μ •μ§€ μƒνƒœμ˜ μŠ€λ ˆλ“œμ— InterruptedException을 λ°œμƒμ‹œμΌœ μ˜ˆμ™Έ 처리 μ½”λ“œμ—μ„œ μ‹€ν–‰ λŒ€κΈ° μƒνƒœλ‚˜ μ’…λ£Œ μƒνƒœλ‘œ λ³€κ²½ν•œλ‹€.
  • sleep(long millis): μ£Όμ–΄μ§„ μ‹œκ°„ λ™μ•ˆ μŠ€λ ˆλ“œλ₯Ό μΌμ‹œ μ •μ§€ μƒνƒœλ‘œ λ§Œλ“€κ³  μ‹œκ°„μ΄ μ§€λ‚˜λ©΄ μ‹€ν–‰ λŒ€κΈ° μƒνƒœκ°€ λœλ‹€.
  • stop(): μŠ€λ ˆλ“œλ₯Ό μ¦‰μ‹œ μ’…λ£Œν•œλ‹€. λΆˆμ•ˆμ „ μ’…λ£Œλ₯Ό μœ λ°œν•˜λ―€λ‘œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹λ‹€.
// 1. stop ν”Œλž˜κ·Έ 이용
public class EXThread extends Thread {
	private boolean stop;
	
	public void setStop(boolean stop) {
	  this.stop = stop;
	}
	
	public void run() {	
		while(!stop) {
			System.out.println("μ‹€ν–‰ 쀑");
		}	
		System.out.println("μžμ› 정리");
		System.out.println("μ‹€ν–‰ μ’…λ£Œ");
	}
}

exThread.setStop(true);

// 2. interrupt() 이용
// 단, μΌμ‹œ μ •μ§€ μƒνƒœκ°€ λ˜μ§€ μ•ŠμœΌλ©΄ μ˜λ―Έκ°€ μ—†λ‹€.
public class EXThread extends Thread {
	public void run() {	
		try {
			while(true) {
				System.out.println("μ‹€ν–‰ 쀑");
				Thread.sleep(1);
			}	
		} catch(InterruptedException e) {}
		
		System.out.println("μžμ› 정리");
		System.out.println("μ‹€ν–‰ μ’…λ£Œ");
	}
}

exThread.interrupt();
μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
'πŸ“ Language/✏ JAVA' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [JAVA] μž…μΆœλ ₯ 슀트림
  • [JAVA] μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬
  • [JAVA] κΈ°λ³Έ API 클래슀
  • [JAVA] 쀑첩 ν΄λž˜μŠ€μ™€ 쀑첩 μΈν„°νŽ˜μ΄μŠ€
Blxxming
Blxxming
CS 지식과 κ³΅λΆ€ν•˜λ‹€ 배운 것, κ²½ν—˜ν•œ 것 등을 κΈ°λ‘ν•˜λŠ” λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€.
  • Blxxming
    πŸ’‘λ²ˆλœ©πŸ’‘
    Blxxming
  • 전체
    였늘
    μ–΄μ œ
  • 곡지사항

    • Tech Interview
    • πŸ“š Tech (246)
      • πŸ“ Computer Science (96)
        • ✏ OS (12)
        • ✏ Network & Web (10)
        • ✏ Database (11)
        • ✏ Data Structure (6)
        • ✏ Algorithm (40)
        • ✏ Design Pattern (9)
        • ✏ Cloud Computing (3)
        • ✏ (5)
      • πŸ“ Language (73)
        • ✏ Language (6)
        • ✏ C & C++ (11)
        • ✏ C# (19)
        • ✏ JAVA (37)
      • πŸ“ Game (43)
        • ✏ Computer Graphics (2)
        • ✏ Unity (14)
        • ✏ Unreal (26)
        • ✏ (1)
      • πŸ“ Book (34)
        • ✏ Effective (3)
        • ✏ Game Server (16)
        • ✏ Clean Code (14)
        • ✏ (1)
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
Blxxming
[JAVA] μŠ€λ ˆλ“œ
μƒλ‹¨μœΌλ‘œ

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