JavaRush /Java Blog /Random-KO /๋ ˆ๋ฒจ 28. ๋ ˆ๋ฒจ ์ฃผ์ œ์— ๋Œ€ํ•œ ์ธํ„ฐ๋ทฐ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€
zor07
๋ ˆ๋ฒจ 31
ะกะฐะฝะบั‚-ะŸะตั‚ะตั€ะฑัƒั€ะณ

๋ ˆ๋ฒจ 28. ๋ ˆ๋ฒจ ์ฃผ์ œ์— ๋Œ€ํ•œ ์ธํ„ฐ๋ทฐ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„! ๋‚˜๋Š” ์ด๋ฏธ Java์—์„œ ์ผ์ž๋ฆฌ๋ฅผ ์ฐพ์•˜์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Javarash์—์„œ ๊ณต๋ถ€๋ฅผ ๊ณ„์†ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ ˆ๋ฒจ 28. ๋ ˆ๋ฒจ-1 ์ฃผ์ œ์— ๊ด€ํ•œ ์ธํ„ฐ๋ทฐ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€๋‚˜๋Š” ๋‚˜ ์ž์‹ ์„ ์œ„ํ•ด ๋งค์šฐ ๊ฒŒ์œผ๋ฅด๊ฒŒ, ๊ทธ๋ฆฌ๊ณ  ์••๋ฐ•๊ฐ์„ ๋Š๋ผ๋ฉฐ ์ด ๋ธ”๋กœ๊ทธ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ๊ฒƒ์ด ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋งค์šฐ ๊ธฐ์  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ ˆ๋ฒจ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ์ฐพ๋Š” ์ฃผ์š” ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

1. ์Šค๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์‹œ์Šคํ…œ์˜ ๊ฐ ์Šค๋ ˆ๋“œ์—๋Š” ๊ณ ์œ ํ•œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„๋Š” ์Šค๋ ˆ๋“œ ๊ฐœ์ฒด์— ์žˆ๋Š” 1๋ถ€ํ„ฐ 10๊นŒ์ง€์˜ ์ˆซ์ž์ด๋ฉฐ, ๊ฐ’์ด ๋†’์„์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์€ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์€ ์Šค๋ ˆ๋“œ๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•˜๊ณ , ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ์Šค๋ ˆ๋“œ๋Š” ๋” ๋งŽ์€ ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์Šค๋ ˆ๋“œ๊ฐ€ ์œ ํœด ์ƒํƒœ์ผ ๋•Œ๋งŒ CPU ์‹œ๊ฐ„์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
void setPriority(int priority) //ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตั‚ ะฟั€ะธะพั€ะธั‚ะตั‚ ะฟะพั‚ะพะบะฐ.
๊ฐ€๋Šฅํ•œ ์šฐ์„ ์ˆœ์œ„ ๊ฐ’์€ MIN_PRIORITY, NORM_PRIORITY ๋ฐ MAX_PRIORITY์ž…๋‹ˆ๋‹ค.
int getPriority() // ะฟะพะปัƒั‡ะฐะตั‚ ะฟั€ะธะพั€ะธั‚ะตั‚ ะฟะพั‚ะพะบะฐ.
์†Œ์Šค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์Šค๋ ˆ๋“œ๋Š” ์šฐ์„ ์ˆœ์œ„ 5 - ์ค‘๊ฐ„์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„๋Š” ์ž‘์—…์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์ง€๋งŒ ๋ณธ์งˆ์ ์œผ๋กœ ๊ถŒ๊ณ  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์‹œ์ž‘ํ•ด์•ผ ํ•  ํœด๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ Java ์‹œ์Šคํ…œ์€ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์€ ์Šค๋ ˆ๋“œ๋ฅผ ๋จผ์ € ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. Java ์‹œ์Šคํ…œ์€ ์ ์ ˆํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” ๋Œ€๋กœ ์Šค๋ ˆ๋“œ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ์Šค๋ ˆ๋“œ๋Š” ์œ ํœด ์ƒํƒœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋ณด๋‹ค ์‹œ๊ฐ„์ด ๋œ ๊ฑธ๋ฆด ๋ฟ์ด์ง€๋งŒ ์—ฌ์ „ํžˆ ์ฒ˜ํ˜•๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์Šค๋ ˆ๋“œ๋Š” ํ•ญ์ƒ ๋™์ผํ•œ ์šฐ์„ ์ˆœ์œ„๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ•œ ์Šค๋ ˆ๋“œ์— ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋ณด๋‹ค ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ์ฃผ๋ ค๊ณ  ํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตฌ์กฐ์  ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

2. ์šฐ์„ ์ˆœ์œ„๋ฅผ 0์œผ๋กœ ์ค„์—ฌ ์Šค๋ ˆ๋“œ๋ฅผ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”. ๋˜์ ธ์งˆ ๊ฒƒ์ด๋‹คIllegalArgumentException

3. ThreadGroup ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์–ด๋–ค ์Šค๋ ˆ๋“œ๊ฐ€ ์—ฐ์†์ ์œผ๋กœ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ์ค‘์ง€ํ•˜๊ณ  ์ค‘๋‹จํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด "์Šค๋ ˆ๋“œ ๊ทธ๋ฃน"์ด๋ผ๋Š” ๊ฐœ๋…์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๋Š” ์ž์‹ ๊ณผ ๋™์ผํ•œ ๊ทธ๋ฃน์— ํฌํ•จ๋œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ThreadGroup์Šค๋ ˆ๋“œ ๊ทธ๋ฃน์„ ๊ด€๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์›์น˜ ์•Š๋Š” ๋ณ€๊ฒฝ์œผ๋กœ๋ถ€ํ„ฐ ์Šค๋ ˆ๋“œ๋ฅผ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” 100% ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•  ๋•Œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ๋ณ„๋„์˜ ๊ทธ๋ฃน์— ๋ฐฐ์น˜ํ•˜๊ณ  ๊ธฐ๋ณธ ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน์˜ ์ž‘์—…์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋„๋ก ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน์„ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด

4. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ์–ด๋–ค ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน์— ์†ํ•ฉ๋‹ˆ๊นŒ?

main

5. ThreadPool ํŒจํ„ด์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ผ๋ฐ˜์ ์œผ๋กœ ํŒจํ„ด์€ ThreadPool๋ฌธ์ œ ๊ทธ๋ฃน์„ ํ•ด๊ฒฐํ•˜๋Š” ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน์ž…๋‹ˆ๋‹ค. ์ž‘์—…์€ ๋Œ€๊ธฐ์—ด๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘์—… ์ž‘์—…์„ ๋งˆ์น˜๋ฉด ๋Œ€๊ธฐ์—ด์˜ ๋ชจ๋“  ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ์—ด์—์„œ ๋‹ค์Œ ์ž‘์—…์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„์—๋Š” ์ƒˆ ์ž‘์—…์ด ๋Œ€๊ธฐ์—ด์— ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ์ ˆ์ „ ๋ชจ๋“œ๋กœ ์ „ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6. ThreadPoolExecutor ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์Šค๋ ˆ๋“œ ๊ทธ๋ฃน์œผ๋กœ ์ˆ˜๋งŽ์€ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค์˜ ๋‚ญ๋น„๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ž‘์—…์— ๋Œ€ํ•ด ์ž์‹ ๋งŒ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ทธ๋ฆฌ ํ•ฉ๋ฆฌ์ ์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Java ์‹œ์Šคํ…œ์€ ๊ฐ ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์†Œ๋ชจ๋œ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํŒŒ๊ดดํ•˜๋Š” ๊ฒƒ์€ ์ž‘์—… ์ž์ฒด๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฆฌ์†Œ์Šค์™€ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Java ๊ฐœ๋ฐœ์ž๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์šฐ์•„ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค ThreadPoolExecutor. ์ด๊ฒƒ์€ ๋‚ด๋ถ€์— ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
  • ํ”„๋กœ๊ทธ๋žจ์— ๋‚˜ํƒ€๋‚˜๋Š” ์ž‘์—…์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—… ๋Œ€๊ธฐ์—ด์ž…๋‹ˆ๋‹ค.
  • ์Šค๋ ˆ๋“œ ํ’€(์Šค๋ ˆ๋“œ ๊ทธ๋ฃน) - ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ฒฝ์šฐ ์ž‘์—…์„ ์™„๋ฃŒํ•œ ํ›„์—๋„ ์Šค๋ ˆ๋“œ๊ฐ€ ์‚ญ์ œ๋˜์ง€ ์•Š๊ณ  ์ž ์ž๊ธฐ ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ž‘์—…์ด ๋‚˜ํƒ€๋‚˜์ž๋งˆ์ž ์™„๋ฃŒ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

7. ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ๋ช‡ ๊ฐ€์ง€๋‚˜ ์•Œ๊ณ  ์žˆ๋‚˜์š”? (์Šค๋ ˆ๋“œ, ์‹คํ–‰ ๊ฐ€๋Šฅ, ํ˜ธ์ถœ ๊ฐ€๋Šฅ )

public class ThreadsTests {
    //ะกะฟะพัะพะฑ 1
    static class ThreadExampleRunnable implements Runnable{
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName());
        }
    }

    //ะกะฟะพัะพะฑ 2
    static class ThreadExampleFromThread extends Thread {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName());
        }
    }

    //ะกะฟะพัะพะฑ 3
    static class ThreadExampleFromCallable implements Callable{
        @Override
        public String call() throws Exception {
            return Thread.currentThread().getName();
        }
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        new Thread(new ThreadExampleRunnable()).start(); //ะกะฟะพัะพะฑ 1
        new ThreadExampleFromThread().start(); //ะกะฟะพัะพะฑ 2

        //ะกะฟะพัะพะฑ 3
        ExecutorService service = Executors.newFixedThreadPool(5);
        Future task = service.submit(new ThreadExampleFromCallable());
        System.out.println(task.get());

    }
}

8. Future ํด๋ž˜์Šค๋Š” ์–ด๋–ค ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๋‚˜์š”?

์ด ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์ด ์ด๋ฏธ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. boolean cancel(boolean mayInterrupt); // ะžัั‚ะฐะฝะฐะฒะปะธะฒะฐะตั‚ ะทะฐะดะฐั‡ัƒ.
boolean isCancelled(); //returns true, ะตัะปะธ ะทะฐะดะฐั‡ะฐ ะฑั‹ะปะฐ ะพัั‚ะฐะฝะพะฒะปะตะฝะฐ.
boolean isDone(); //returns true, ะตัะปะธ ะฒั‹ะฟะพะปะฝะตะฝะธะต ะทะฐะดะฐั‡ะธ ะทะฐะฒะตั€ัˆะตะฝะพ.
V get() throws InterruptedException, ExecutionException; //returns ั€ะตะทัƒะปัŒั‚ะฐั‚ ะฒั‹ะทะพะฒะฐ ะผะตั‚ะพะดะฐ call or ะบะธะดะฐะตั‚ ะธัะบะปัŽั‡ะตะฝะธะต, ะตัะปะธ ะพะฝะพ ะฑั‹ะปะพ.

9. Runnable์— ๋น„ํ•ด Callable์˜ ์žฅ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์‚ฌ์šฉํ•˜๋ฉด Callable์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.Runnable

10. Future ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘์—… ์‹คํ–‰์„ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

์ž‘์—…์ด ๋Œ€๊ธฐ์—ด์— ์žˆ๊ณ  ์‹คํ–‰์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒฝ์šฐ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค.
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION