"์•ˆ๋…•ํ•˜์„ธ์š”, ์•„๋ฏธ๊ณ ! ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๊ฑฐ๋‚˜ ๊ณง ํ•  ํฅ๋ฏธ๋กœ์šด ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํ–‰ ์ค‘์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ค‘์ง€ํ•ฉ๋‹ˆ๊นŒ? "

์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์— "์ธํ„ฐ๋„ท์—์„œ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ"ํ•˜๋ผ๊ณ  ์ง€์‹œํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์Šค๋ ˆ๋“œ๋Š” ์ด ์ž‘์—…์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์ž์‹ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ž‘์—…์ด ํฌํ•จ๋œ ์‹คํ–‰ ๋ฉ”์„œ๋“œ์˜ ๊ฐœ์ฒด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

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

"์˜ˆ, ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ์„ธ์š”?"

" ์šฐ๋ฆฌ๋Š” ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด๊ณ  ๊ฐ€์žฅ ์ •ํ™•ํ•œ ๋Œ€๋‹ต์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์Šค๋ ˆ๋“œ๋ฅผ ๋ฉˆ์ถœ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ค์ง ์Šค์Šค๋กœ ๋ฉˆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "

๊ทธ๋Ÿฌ๋‚˜ ์ž‘์—…์„ ๋” ์ด์ƒ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ์ข…๋ฃŒํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‹ ํ˜ธ๋ฅผ ์Šค๋ ˆ๋“œ์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ฉ”์ธ ๋ฉ”์†Œ๋“œ์—์„œ ๋ฆฌํ„ดํ•˜์—ฌ ์ข…๋ฃŒํ•˜๋“ฏ์ด, ์ž์‹ ์“ฐ๋ ˆ๋“œ๋Š” run ๋ฉ”์†Œ๋“œ์—์„œ ๋ฆฌํ„ดํ•˜์—ฌ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

"๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?"

" ๋ถ€์šธ ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . true ์ด๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. false ์ด๋ฉด  ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค."

์•”ํ˜ธ ์„ค๋ช…
class Clock implements Runnable
{
public void run()
{
while (true)
{
Thread.sleep(1000);
System.out.println("Tick");

if (!ClockManager.isClockRun)
return;
}
}
}

Clock ํด๋ž˜์Šค๋Š” ์˜์›ํžˆ 1์ดˆ์— ํ•œ ๋ฒˆ์”ฉ ์ฝ˜์†”์— ยซTickยป์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

ClockManager.isClockRun์ด false์ด๋ฉด ์‹คํ–‰ ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

class ClockManager
{
public static boolean isClockRun = true;
public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
isClockRun = false;
}

}
๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ์˜์›ํžˆ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ํ•˜์œ„ ์Šค๋ ˆ๋“œ(์‹œ๊ณ„)๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

10์ดˆ๊ฐ„ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์‹œ๊ณ„์— ์ข…๋ฃŒ ์‹ ํ˜ธ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

ํด๋Ÿญ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘์—…์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

"์Šค๋ ˆ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ?"

"์Šค๋ ˆ๋“œ๋งˆ๋‹ค ์ด๋Ÿฐ ๋ณ€์ˆ˜๋ฅผ ๋‘๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค์— ์ง์ ‘ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์— boolean isRun ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ๊ทธ๋Ÿฌ๋‚˜ ์ž‘์—…์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ true๊ฐ€ ๋˜๋Š” boolean isCancel ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ทจ์†Œ ๋œ."

์•”ํ˜ธ ์„ค๋ช…
class Clock implements Runnable
{
private boolean isCancel = false;

public void cancel()
{
this.isCancel = true;
}

public void run()
{
while (!isCancel)
{
Thread.sleep(1000);
System.out.println("Tick");
}
}
}
Clock ํด๋ž˜์Šค๋Š” isCancel์ด false ์ธ ํ•œ 1์ดˆ์— ํ•œ ๋ฒˆ์”ฉ ยซTickยป์ด๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์ฝ˜์†”์— ์”๋‹ˆ๋‹ค .

isCancel ์ด true๊ฐ€ ๋˜๋ฉด run ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
clock.cancel();
}
๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ์˜์›ํžˆ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ํ•˜์œ„ ์Šค๋ ˆ๋“œ(์‹œ๊ณ„)๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

10์ดˆ๊ฐ„ ๊ธฐ๋‹ค๋ฆฐ ํ›„  cancel ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ž‘์—…์„ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

ํด๋Ÿญ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘์—…์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

"๋ช…์‹ฌํ• ๊ฒŒ์š”. ๊ณ ๋งˆ์›Œ์š”, ์—˜๋ฆฌ."