๐ŸฆŠ reference

  • ๋‚จ๊ถ์„ฑ ์ž๋ฐ”์˜ ์ •์„

๐ŸฆŠ base core concept

  • process
    : ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ, resources์™€ thread๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

  • thread
    : ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์‹ค์ œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ผ๊พผ

  • single thread
    : resource + thread

  • multi thread
    : resource + thread x n, ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ์•ˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ


์žฅ์  )
1. ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋” ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค thread๋ฅผ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์ด ๋” ๋„์›€๋จ.
2. ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๋‹จ์  )
1. ๋™๊ธฐํ™” ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
2. Starvation(๊ธฐ์•„ ์ƒํƒœ), Deadlocked(๊ต์ฐฉ ์ƒํƒœ) ์ƒํƒœ ๋ฐœ์ƒ ๊ฐ€๋Šฅ

  • Thread pool
    : ์“ฐ๋ ˆ๋“œ๋ฅผ ํ•„์š”ํ•  ๋•Œ ๋งˆ๋‹ค ์ƒ์„ฑํ•˜๊ณ  ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ cpu ๋น„์šฉ์ด ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ฐจ๋ผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•ด๋†“๊ณ  ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ผ๊ฐ์„ ํ• ๋‹นํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.


๐ŸฆŠ thread ๊ตฌํ˜„ ๋ฐฉ์‹

๐Ÿค ๋ฐฉ1) Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†

  • ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ Thread ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Thread.class : ๊ธฐ๋ณธ ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค, Runnable ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.


public class Thread implements Runnable {
	
}

๋ฉ”์„œ๋“œ ์ข…๋ฅ˜
์ฐธ๊ณ  : https://www.tutorialspoint.com/java/lang/java_lang_thread.htm

์ˆœ์„œ๋ฉ”์„œ๋“œ ๋ช…์„ค๋ช…
1currentThread()ํ˜„์žฌ ์“ฐ๋ ˆ๋“œ ์˜ค๋ธŒ์ ํŠธ ๋ฐ˜ํ™˜
2getName()์“ฐ๋ ˆ๋“œ ์ด๋ฆ„ ๋ฐ˜ํ™˜
3getPriority()์“ฐ๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„ ํ˜ธ์ถœ
4setPriority()์“ฐ๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„ ์„ธํŒ…
5run()์“ฐ๋ž˜๋“œ ๋‚ด๋ถ€์—์„œ ์‹œ์ž‘
6sleep()sleep()
7start()์“ฐ๋ ˆ๋“œ ์‹œ์ž‘
8clone()ํด๋ž˜์Šค ๊ฐ์ฒด ๋ณต์‚ฌ ๋ฉ”์„œ๋“œ
9getId()์“ฐ๋ ˆ๋“œ ์•„์ด๋”” ๋ฐ˜ํ™˜
10holdsLock()ํ˜„์žฌ ์“ฐ๋ ˆ๋“œ ๋ฝ
11join()์“ฐ๋ ˆ๋“œ๊ฐ€ ์ฃฝ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ
12yield()

์˜ˆ์ œ)


package com.company;

public class Thread01 extends Thread {
    public void run() {
        System.out.println("thread ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.");

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println( currentThread().getName() + " ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.");

    }

    public static void main(String[] args) {
        Thread01 thread01 = new Thread01();
        thread01.setName("thread01");
        thread01.start();


        Thread01 thread02 = new Thread01();
        thread02.setName("thread02");
        thread02.start();
    }
}


๐Ÿค 2) Runnable ํด๋ž˜์Šค ์‚ฌ์šฉ

  • 2๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ์ง์ ‘์ ์œผ๋กœ Runnable์„ ์‚ฌ์šฉํ•˜์—ฌ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

package com.company;

public class Thread02 implements Runnable{


    @Override
    public void run() {
        System.out.println("thread ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.");

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println( Thread.currentThread().getId() + "๋ฒˆ ์“ฐ๋ ˆ๋“œ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.");
    }

    public static void main(String[] args) {

        Thread02 thread02 = new Thread02();
        thread02.run();
        
    }
}



๐ŸฆŠ thread Pool ๊ตฌํ˜„ ๋ฐฉ์‹

๐Ÿค 1) Executors, ExecutorService ์‚ฌ์šฉ

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html

  • Executors, ExecutorService ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด threadPool์„ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.
์ˆœ์„œ๋ฉ”์„œ๋“œ ๋ช…์„ค๋ช…
1boolean awaitTermination()์ข…๋ฃŒ ์š”์ฒญ ํ›„ ๋ชจ๋“  ์ž‘์—…์ด ์‹คํ–‰ ์™„๋ฃŒ๋˜๊ฑฐ๋‚˜ ์‹œ๊ฐ„์ดˆ๊ฐ€ ๋˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
2 List<Future> invokeAll() (Collection <? extends Callable tasks>)์ฃผ์–ด์ง„ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  ์™„๋ฃŒ ๋˜๋ฉด ์ƒํƒœ์™€ ๊ฒฐ๊ณผ๋ฅผ ์œ ์ง€ํ•˜๋Š” Future ๋ชฉ๋ก ๋ฐ˜ํ™˜
3 T invokeAny(Collection <? extends > tasks)์ฃผ์–ด์ง„ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๊ฒฝ๊ณผํ•˜๊ธฐ ์ „์— ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋œ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜
4boolean isShutdown()true ์ด ์‹คํ–‰๊ธฐ์— ์ข…๋ฃŒ๋œ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜
5boolean isTerminated()true ์ข…๋ฃŒ ํ›„ ๋ชจ๋“  ์ž‘์—…์ด ์™„๋ฃŒ๋œ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜
6void shutdown()์ด์ „์— submit() ๋œ๊ฒƒ์€ ์‹คํ–‰๋˜์ง€๋งŒ ์ƒˆ ์ž‘์—…์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์€ ์ฑ„๋กœ ์ข…๋ฃŒ ๊ธฐ๋‹ค๋ฆผ
7List shutdownNow()๋ชจ๋“  ํ™œ์„ฑ ์‹คํ–‰ ์ž‘์—…์„ ์ค‘์ง€ํ•˜๊ณ  ์‹คํ–‰ ๋Œ€๊ธฐ ์ค‘์ด๋˜ ์ž‘์—…์„ ๋ฐ˜ํ™˜
8 Future submit(Callable task)์‹คํ–‰์„ ์œ„ํ•ด Runnable ์ž‘์—…์„ ์ œ์ถœํ•˜๊ณ  ํ•ด๋‹นํ•˜๋Š” ์ž‘์—…์˜ Future ๋ฐ˜ํ™˜

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Thread03 {

    public static void main(String[] args) {
       // ์“ฐ๋ ˆ๋“œ ํ•˜๋‚˜ ์ƒ์„ฑ
        ExecutorService es = Executors.newSingleThreadExecutor();

        es.submit(() -> {
           System.out.println(Thread.currentThread().getName() + " ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.");
        });


        // ์“ฐ๋ ˆ๋“œ ํ’€ ํ•˜๋‚˜ ์ƒ์„ฑ
        es.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + " ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.");
            }
        });

        ExecutorService es2 = Executors.newFixedThreadPool(10);


        for(int i = 0 ; i < 10 ; i++ ) {
            es2.submit(() -> {
                System.out.println(Thread.currentThread().getName() + " ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println(Thread.currentThread().getName() + " ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.");

            });
        }

        es.shutdown();
        es2.shutdown();

    }


}

์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ์™€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์ฐจ์ด๋Š”?

ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋กœ 2๊ฐœ์˜ ์ž‘์—…์„ ํ•œ ์‹œ๊ฐ„๊ณผ ๋‘๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋กœ 2๊ฐœ์˜ ์ž‘์—…์„ ํ•œ์‹œ๊ฐ„์„ ์‚ฌ์‹ค 2๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋กœ ์ž‘์—…ํ•œ ์‹œ๊ฐ„์ด ๋” ๊ธธ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•˜๋‚˜์˜ ์ž์›์„ ๋‘๊ณ  ์“ฐ๋ ˆ๋“œ๊ฐ„ ์ž‘์—…์„ ๊ตํ™˜ํ•˜๋Š” ์‹œ๊ฐ„(context switching) ์— ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•˜์ง€๋งŒ ๋ฉ€ํ‹ฐ ์ฝ”์–ด์ผ๊ฒฝ์šฐ, ์ฆ‰ ์ž์›์ด 2๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ๋Š” ๋‹ค๋ฅด๋‹ค. ํ‚ค๋ณด๋“œ๋กœ ์ž…๋ ฅํ•˜๋Š” ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์ž‘ํ•  ๋•Œ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์‹œ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ชจ๋‹ˆํ„ฐ์— ๊ธ€์ž๊ฐ€ ํ‘œํ˜„๋˜๋Š” ์ผ์€ ์—†์„ ๊ฒƒ์ด๋‹ค. ์ด์ฒ˜๋Ÿผ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋Š” ๋ฉ€ํ‹ฐ ์ฝ”์–ด์ผ๋•Œ ์ž‘์—… ํšจ์œจ์„ ์ข‹๊ฒŒ ๋งŒ๋“ ๋‹ค.

์“ฐ๋ ˆ๋“œ์˜ ์šฐ์„ ์ˆœ์œ„

์ด๋ ‡๊ฒŒ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋Œ์•„๊ฐˆ ๊ฒฝ์šฐ ์“ฐ๋ ˆ๋“œ์˜ ์šฐ์„ ์ˆœ์œ„๋„ ์ค‘์š”ํ•ด์ง„๋‹ค. ํŒŒ์ผ๋‹ค์šด๋กœ๋“œ๋ž‘ ํ‚ค๋ณด๋“œ ์น˜๊ธฐ๊ฐ€ ๋™์‹œ์— ๋Œ์•„๊ฐ€๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ฑ„๊ฐํ•˜๊ธฐ ์‰ฌ์šด ํ‚ค๋ณด๋“œ ์น˜๊ธฐ๊ฐ€ ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์•„์•ผ ์—ฌ๋Ÿฌ ํŽธ์˜์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์šฐ์„ ์ˆœ์œ„๋Š” 1-10 ๊นŒ์ง€์˜ ์ˆซ์ž๋กœ ๋‚˜๋ˆŒ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ณดํ†ต 10์ด ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค.



์“ฐ๋ ˆ๋“œ ๊ทธ๋ฃน

๋˜ํ•œ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ์—์„œ๋Š” ๊ด€๋ จ์žˆ๋Š” ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ทธ๋ฃน์œผ๋กœ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ ๋ณด์•ˆ์ ์ธ ์ด์œ ๋กœ ์ด๋ ‡๊ฒŒ ๋ฌถ์–ด์„œ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์ž์‹ ์ด ์†ํ•œ ์“ฐ๋ ˆ๋“œ ๊ทธ๋ฃน์ด๋‚˜ ํ•˜์œ„ ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน์˜ ์“ฐ๋ ˆ๋“œ๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ๋Š” ์—†๋‹ค.

profile
๊ฐœ๋ฐœ ๋กœ๊ทธ ๐ŸŽ ๐ŸŽ ๐ŸŽ

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด

Powered by GraphCDN, the GraphQL CDN