๐ŸงตJava Thread

1 minute read

JVM๊ณผ Thread

ํ”„๋กœ์„ธ์Šค์™€ ์“ฐ๋ ˆ๋“œ

  • JVM์ด ์‹œ์ž‘๋˜๋ฉด Java ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘๋œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ด ํ”„๋กœ์„ธ์Šค ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋ผ๋Š” ๊ฒƒ์ด ์•„๋‘ฅ๋ฐ”๋‘ฅ ์‚ด๊ฒŒ๋œ๋‹ค.
  • Tomcat๊ณผ ๊ฐ™์€ WAS๋„ ์—ญ์‹œ๋‚˜ ๋˜‘๊ฐ™์ด main() ๋ฉ”์†Œ๋“œ์—์„œ ์ƒ์„ฑํ•œ ์“ฐ๋ ˆ๋“œ๋“ค์ด ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.

Java์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์กด์žฌํ•˜๋Š” Thread๋“ค

  • ์•„๋ฌด๋Ÿฐ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ JVM์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค๋ฉด Java์˜ ์“ฐ๋ ˆ๊ธฐ ๊ฐ์ฒด๋ฅผ ์ฒญ์†Œํ•˜๋Š” GC ๊ด€๋ จ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์—ฌ๊ธฐ์— ์†ํ•œ๋‹ค.

Thread์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„

  • JVM์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„๋ฌด๋Ÿฐ ์˜ต์…˜ ์—†์ด ์‹คํ–‰ํ•˜๋ฉด OS๋งˆ๋‹ค ๋‹ค๋ฅด์ง€๋งŒ ์ ์–ด๋„ 32MB~64MB์˜ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์œ ํ•œ๋‹ค.
  • ๊ทธ์— ๋ฐ˜ํ•ด์„œ, ์“ฐ๋ ˆ๋“œ๋ฅผ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•˜๋ฉด 1MB ์ด๋‚ด์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์œ ํ•œ๋‹ค.
  • ๊ทธ๋ž˜์„œ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ฒฝ๋Ÿ‰ ํ”„๋กœ์„ธ์Šค๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

Java์™€ Thread

์ƒ์„ฑ

  • Runnable ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ Thread ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • ๋‘˜๋‹ค java.lang์— ์žˆ๋‹ค.
  • ๋‘˜๋‹ค run()์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.
  • ๋˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•  ํ•„์š”๊ฐ€ ์žˆ์„๋•Œ๋Š” Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Thread์˜ ์ด๋ฆ„

  • ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๋Š” ์ด๋ฆ„์ด ์žˆ๋‹ค.
  • ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ทธ ์“ฐ๋ ˆ๋“œ์˜ ์ด๋ฆ„์€ Thread-n์ด๋‹ค.

์šฐ์„ ์ˆœ์œ„ ์ง€์ •

  • ์šฐ์„ ์ˆœ์œ„ ๊ด€๋ จ ์ƒ์ˆ˜๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋‹ค.
  • MAX_PRIORITY, NORM_PRIORITY, MIN_PRIORITY
  • ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

Stack ์‚ฌ์ด์ฆˆ

  • ์ƒ์„ฑ์‹œ stackSize๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ๋Š” ์ด ๊ฐ’์ด ๋ฌด์‹œ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

Sleep ๋ฉ”์†Œ๋“œ

  • Thread ํด๋ž˜์Šค์—๋Š” sleep() ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋‹ค.
  • Thread.sleep()์„ ์“ธ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ try-catch๋กœ ๋ฌถ๊ณ , ์ ์–ด๋„ InterruptedExceiption์œผ๋กœ catchํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

๋ฐ๋ชฌ ์“ฐ๋ ˆ๋“œ

  • ๋ฐ๋ชฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉ์ž ์“ฐ๋ ˆ๋“œ๋Š” JVM์ด ํ•ด๋‹น ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
  • thread.setDaemon(true);
  • ์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์“ฐ๋ ˆ๋“œ๋ฅผ ๋ณ„๋„๋กœ ๋„์›Œ ๋ชจ๋‹ˆํ„ฐ๋งํ• ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

join ๋ฉ”์†Œ๋“œ

  • ์ธ์ž๊ฐ€ ์—†๋‹ค๋ฉด ์‹œ๊ฐ„์ œํ•œ์—†์ด ์ˆ˜ํ–‰ ์ค‘์ธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ค‘์ง€ํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•œ๋‹ค.
  • join(6000);๊ณผ ๊ฐ™์ด ์ธ์ž๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ํŠน์ • ์‹œ๊ฐ„๋งŒํผ๋งŒ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

interrupt ๋ฉ”์†Œ๋“œ

  • InterruptedException์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

Synchronized

  • ๋ฉ”์†Œ๋“œ ์ž์ฒด๋ฅผ synchronized๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    • synchronized methods๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
    • public synchronized void plus(int value) { ... }
  • ๋ธ”๋ก์œผ๋กœ ๊ฐ์‹ธ๋Š” ๋ฐฉ๋ฒ•
    • synchronized statements๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
      - synchronized(this) { ... }
    • ์ž ๊ธˆ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•ด์•ผํ•œ๋‹ค.
    • Object lock = new Object; synchronized(lock) { ... }

์˜ˆ์ œ ์ฝ”๋“œ

public class StateThread extends Thread {  
	private Object monitor;  
	public StateThread(Object monitor) {  
		this.monitor = monitor;  
	}  
  
	public void run() {  
		try {  
			for (int loop = 0; loop < 10000; loop++) {  
				String a = "A";  
			}  
			synchronzied(monitor) {  
				// ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ Object ๊ฐ์ฒด์— ๋Œ€ํ•œ notify() ๋ฉ”์†Œ๋“œ๋‚˜ notifyAll() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๊นŒ์ง€  
				// ํ˜„์žฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋„๋ก ํ•œ๋‹ค.  
				monitor.wait();		  
			}  
			Thread.sleep(1000);  
		} catch(InterruptedException ie) {  
			ie.printStackTrace();  
		}  
	}  
}  

[1] ์ด์ƒ๋ฏผ, 25์žฅ โ€œ์“ฐ๋ ˆ๋“œ๋Š” ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ์•Œ์•„๋‘๋Š” ๊ฒƒ์ด ์ข‹์•„์š”โ€, ์ž๋ฐ”์˜็ฅž 2nd Edition