Java의 스레드 풀

10402 단어
스레드 풀은 이미 생성된 스레드를 사용하여 작업을 실행합니다.
새 스레드를 생성하는 오버헤드를 방지합니다.
스레드 풀의 경우 고정된 크기의 스레드 그룹이 생성됩니다.
스레드 풀에서 스레드를 꺼내고 taks를 할당하고 작업 완료 후 스레드는 재사용을 위해 스레드 풀로 다시 돌아갑니다.

Java는 다음을 중심으로 하는 Executor 프레임워크를 사용합니다.
  • Executor 인터페이스
  • 하위 인터페이스 ExecutorService
  • 및 위의 두 인터페이스
  • 를 모두 구현하는 클래스ThreadPoolExecutor
    Excecutor를 사용하면 Runnable 객체를 생성하고 Executor로 보내 실행()하기만 하면 됩니다.
    고정 크기의 스레드 풀을 만들 수 있습니다. 즉, 풀의 스레드 크기가 미리 정의됩니다.


    실행자 스레드 풀 메서드
    newFixedThreadPool(int) : 고정 크기 스레드 풀을 만듭니다.newCachedThreadPool() : 필요에 따라 새 스레드를 생성하지만 사용 가능한 경우 이전에 구성된 스레드를 재사용하는 스레드 풀을 생성합니다.newSingleThreadExecutor() : 단일 스레드를 만듭니다.

    스레드 풀 예:

    // Java program to illustrate 
    // ThreadPool
    import java.text.SimpleDateFormat; 
    import java.util.Date;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    // Task class to be executed (Step 1)
    class Task implements Runnable   
    {
        private String name;
    
        public Task(String s)
        {
            name = s;
        }
    
        // Prints task name and sleeps for 1s
        // This Whole process is repeated 5 times
        public void run()
        {
            try
            {
                for (int i = 0; i<=5; i++)
                {
                    if (i==0)
                    {
                        Date d = new Date();
                        SimpleDateFormat ft = new SimpleDateFormat("hh:mm:ss");
                        System.out.println("Initialization Time for"
                                + " task name - "+ name +" = " +ft.format(d));   
                        //prints the initialization time for every task 
                    }
                    else
                    {
                        Date d = new Date();
                        SimpleDateFormat ft = new SimpleDateFormat("hh:mm:ss");
                        System.out.println("Executing Time for task name - "+
                                name +" = " +ft.format(d));   
                        // prints the execution time for every task 
                    }
                    Thread.sleep(1000);
                }
                System.out.println(name+" complete");
            }
    
            catch(InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }
    public class Test
    {
         // Maximum number of threads in thread pool
        static final int MAX_T = 3;             
    
        public static void main(String[] args)
        {
            // creates five tasks
            Runnable r1 = new Task("task 1");
            Runnable r2 = new Task("task 2");
            Runnable r3 = new Task("task 3");
            Runnable r4 = new Task("task 4");
            Runnable r5 = new Task("task 5");      
    
            // creates a thread pool with MAX_T no. of 
            // threads as the fixed pool size(Step 2)
            ExecutorService pool = Executors.newFixedThreadPool(MAX_T);  
    
            // passes the Task objects to the pool to execute (Step 3)
            pool.execute(r1);
            pool.execute(r2);
            pool.execute(r3);
            pool.execute(r4);
            pool.execute(r5); 
    
            // pool shutdown ( Step 4)
            pool.shutdown();    
        }
    }
    




    좋은 웹페이지 즐겨찾기