๊ทธ๋งŒํผ

"์•ˆ๋…•, ์•„๋ฏธ๊ณ !"

"wait-notify์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. wait-notify ๋ฉ”์„œ๋“œ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŽธ๋ฆฌํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ์ƒํ˜ธ ์ž‘์šฉ์„ ์œ„ํ•œ ๋ณต์žกํ•œ ๊ณ ์ˆ˜์ค€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."

"์ž‘์€ ์˜ˆ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์›น ์‚ฌ์ดํŠธ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“  ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์„œ๋ฒ„์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ๋‹ค๋ฅธ ์‹œ๊ฐ„์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—…์€ ๋ฆฌ์†Œ์Šค ์ง‘์•ฝ์ ์ด์ง€๋งŒ ์„œ๋ฒ„์˜ 8 -์ฝ”์–ด ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ์ž‘์—…์„ ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?"

"๋จผ์ € ํ”„๋กœ์„ธ์„œ ์ฝ”์–ด ์ˆ˜๋งŒํผ ์ž‘์—…์ž ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ์ž์ฒด ์ฝ”์–ด์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๋Š” ์„œ๋กœ ๊ฐ„์„ญํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ”„๋กœ์„ธ์„œ ์ฝ”์–ด๋Š” ๊ฐ€๋งŒํžˆ ์•‰์•„."

"๋‘ ๋ฒˆ์งธ๋กœ, ์‚ฌ์šฉ์ž์˜ ์ž‘์—…์ด ์ถ”๊ฐ€๋  ๋Œ€๊ธฐ์—ด ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์ž‘์—…์€ ๋‹ค๋ฅธ ๊ฐœ์ฒด์— ํ•ด๋‹นํ•˜์ง€๋งŒ ๋ชจ๋‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค."

"์ž‘์—… ๊ฐœ์ฒด์˜ ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"

"ํ™•์ธ ํ•ด๋ด:"

run() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ n ๊ณ„์Šน์„ ๊ณ„์‚ฐํ•˜๋Š” ํด๋ž˜์Šค
class Factorial implements Runnable
{
 public int n = 0;
 public long result = 1;

 public Factorial (int n)
 {
  this.n = n;
 }

 public void run()
 {
  for (int i = 2; i <= n; i++)
   result *= i;
 }
}

"์—ฌํƒœ๊นŒ์ง€๋Š” ๊ทธ๋Ÿฐ๋Œ€๋กœ ์ž˜๋๋‹ค."

"์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ํ ๊ฐœ์ฒด๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์•ผ ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ฌด์—‡์„ ๋ง์”€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"

"์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ํƒœ์Šคํฌ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ์Šค๋ ˆ๋“œ์— ์˜ํ•ด ํƒœ์Šคํฌ ์˜ค๋ธŒ์ ํŠธ์™€ ํ•จ๊ป˜ ๋กœ๋“œ๋œ ๋‹ค์Œ ์ž‘์—…์ž ์Šค๋ ˆ๋“œ๊ฐ€ ํƒœ์Šคํฌ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค."

"๋„ค. ๊ทธ๋ฆฌ๊ณ  ํ•œ๋™์•ˆ ์ž‘์—…์ด ๋ถ€์กฑํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ• ๊นŒ์š”?"

"๊ทธ๋Ÿฌ๋ฉด ์ž‘์—…์ž ์Šค๋ ˆ๋“œ๋Š” ๋” ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค."

"๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด ๋ชจ๋“  ๊ฒƒ์ด ๋‹จ์ผ ๋Œ€๊ธฐ์—ด์— ๊ตฌ์ถ•๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ํ™•์ธํ•˜์‹ญ์‹œ์˜ค."

ํƒœ์Šคํฌ ํ. ์ž‘์—…์ด ์—†์œผ๋ฉด ์Šค๋ ˆ๋“œ๋Š” ์ž ๋“ค๊ณ  ์ž‘์—…์ด ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
public class JobQueue
{
 ArrayList jobs = new ArrayList();

 public synchronized void put(Runnable job)
 {
  jobs.add(job);
  this.notifyAll();
 }

 public synchronized Runnable getJob()
 {
  while (jobs.size() == 0)
   this.wait();

  return jobs.remove(0);
 }
}

" ์ž‘์—… ๋ชฉ๋ก์ด ๋น„์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” getJob ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค . ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ชฉ๋ก์— ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ์Šค๋ ˆ๋“œ๊ฐ€ ์ ˆ์ „ ๋ชจ๋“œ(๋Œ€๊ธฐ)๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค."

"๋ชฉ๋ก์— ์ƒˆ ์ž‘์—…์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” put ๋ฉ”์„œ๋“œ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค . ์ƒˆ ์ž‘์—…์ด ์ถ”๊ฐ€๋˜์ž๋งˆ์ž notifyAll ๋ฉ”์„œ๋“œ ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด getJob ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ž ๋“  ๋ชจ๋“  ์ž‘์—…์ž ์Šค๋ ˆ๋“œ๊ฐ€ ๊นจ์–ด๋‚ฉ๋‹ˆ๋‹ค.โ€

"๋Œ€๊ธฐ ๋ฐ ์•Œ๋ฆผ ๋ฐฉ๋ฒ•์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋‹ค์‹œ ๊ธฐ์–ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?"

"๋Œ€๊ธฐ ๋ฉ”์„œ๋“œ๋Š” ๋ฎคํ…์Šค ๊ฐœ์ฒด์˜ ๋™๊ธฐํ™”๋œ ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ๋งŒ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ: this์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‘ ๊ฐ€์ง€ ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

1) ์Šค๋ ˆ๋“œ๊ฐ€ ์ž ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

2) ์Šค๋ ˆ๋“œ๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ๋ฎคํ…์Šค๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค(๊นจ์–ด๋‚  ๋•Œ๊นŒ์ง€).

"๊ทธ ํ›„์— ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™๊ธฐํ™”๋œ ๋ธ”๋ก์— ๋“ค์–ด๊ฐ€ ๋™์ผํ•œ ๋ฎคํ…์Šค๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."

" notifyAll ๋ฉ”์„œ๋“œ๋Š” ๋ฎคํ…์Šค ๊ฐœ์ฒด์˜ ๋™๊ธฐํ™”๋œ ๋ธ”๋ก ๋‚ด์—์„œ๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ: this์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‘ ๊ฐ€์ง€ ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค."

1) ์ด ๋ฎคํ…์Šค ๊ฐœ์ฒด๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊นจ์–ด๋‚ฉ๋‹ˆ๋‹ค.

2) ํ˜„์žฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™๊ธฐํ™”๋œ ๋ธ”๋ก์„ ์ข…๋ฃŒํ•˜๋ฉด ๊นจ์–ด๋‚œ ์Šค๋ ˆ๋“œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฎคํ…์Šค๋ฅผ ํš๋“ํ•˜๊ณ  ์ž‘์—…์„ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. ๋ฎคํ…์Šค๋ฅผ ํ•ด์ œํ•˜๋ฉด ๊นจ์–ด๋‚œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฎคํ…์Šค๋ฅผ ํš๋“ํ•˜๋Š” ์‹์ž…๋‹ˆ๋‹ค.

"๋ฒ„์Šค์™€ ๋งค์šฐ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๋“ค์–ด๊ฐ€์„œ ์š”๊ธˆ์„ ์ง€๋ถˆํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์šด์ „์‚ฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ยซ์ž ์ด ๋“ญ๋‹ˆ๋‹คยป. ๊ฒฐ๊ตญ ๋ฒ„์Šค๋Š” ๋งŒ์›์ด์ง€๋งŒ ์—ฌ์ „ํžˆ ์š”๊ธˆ์„ ์ค„ ์‚ฌ๋žŒ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์šด์ „์‚ฌ๋Š” ๋„์ฐฉํ•ด์„œ ยซ์ž˜ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹คยป๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด ์‹œ์ž‘์ž…๋‹ˆ๋‹ค..."

"ํฅ๋ฏธ๋กœ์šด ๋น„๊ต๊ตฐ์š”. ๊ทธ๋Ÿฐ๋ฐ ๋ฒ„์Šค๊ฐ€ ๋ญก๋‹ˆ๊นŒ?"

"Julio๊ฐ€ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. 21 ์„ธ๊ธฐ์— ์‚ฌ์šฉ๋˜๋Š” ์ด์ƒํ•œ ๊ฒƒ๋“ค์ด์žˆ์—ˆ์Šต๋‹ˆ๋‹ค."