Android에서 스레드 풀을 가장 잘 구성하는 방법

스레드 탱크를 언급하면 모든 개발자가 그 중의 장점을 알고 있기 때문에 우리는 스레드 탱크의 장점을 언급하지 않을 수 없다. 1.스레드 탱크의 스레드를 다시 사용하면 스레드의 초기화와 소각으로 인한 성능 비용을 피할 수 있다.스레드 탱크의 최대 병발수를 유한하게 제어하고 스레드 간에 시스템 자원을 서로 빼앗아서 발생하는 막힘을 피할 수 있다.효율적이고 간단한 라인 관리를 할 수 있으며, 간단한 윤문 실행 기능을 제공할 수 있다
스레드 풀 하면 ThreadPoolExecutor 클래스가 필요합니다.
public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue workQueue,
                              ThreadFactory threadFactory) {

    }

그 중의 매개 변수는 각각 뜻하는corePoolsize: 스레드 탱크의 핵심 스레드 수maximumPoolsize: 스레드 탱크에서 가장 큰 스레드 수량이다. 활동 스레드가 이 수량에 도달하면 후속으로 추가된 스레드가 막힌keepAliveTime: 비핵심 스레드가 유휴된 시간 초과, 이 시간을 초과하면비핵심 스레드가 회수되는 unit:keepAliveTime에 대응하는 시간 단위workQueue: 스레드 탱크의 작업 대기열,excute 방법을 통해 제출된 Runnable는 이queue에 저장됩니다.threadFactory: 스레드 공장, 스레드를 통일적으로 초기화하는 입구를 제공합니다
이러한 매개 변수의 뜻을 알게 된 후에 어떻게 효율적인 스레드 탱크를 만드는가에 중점을 두고 코드를 직접 첨부하였다
    /**
     * CPU   
     */
    private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
    /**
     *      
     */
    private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
    /**
     *       
     */
    private static final int MAXMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
    /**
     *           1 
     */
    private static final int KEEP_TIME = 1;

    /**
     *      
     */
    private static final ThreadFactory mThreadFactory = new ThreadFactory() {

        private final AtomicInteger mCount = new AtomicInteger(1);

        @Override
        public Thread newThread(Runnable r) {
            return new Thread(r, "Thread Current ID = " + mCount.getAndIncrement());
        }
    };

    /**
     *           128
     */
    private static final BlockingQueue mPoolWorkQueue = new LinkedBlockingQueue<>(128);

    /**
     *    
     */
    private static final ThreadPoolExecutor mThreadPoolExecutor = new ThreadPoolExecutor(
            CORE_POOL_SIZE, MAXMUM_POOL_SIZE, KEEP_TIME, TimeUnit.SECONDS, mPoolWorkQueue, mThreadFactory);

코드 주석을 통해 모든 매개 변수의 뜻을 한눈에 볼 수 있다.그러나 우리는 ThreadPoolExecutor의 집행 임무 준칙을 총괄해야 한다. 1.만약 스레드 탱크의 스레드 수량이 핵심 스레드 수에 도달하지 않으면 새로운 스레드 클래스가 작업을 수행할 것입니다.만약 핵심 라인의 수량이 가득 차면, 새로 추가된 것은 작업 대기열에 삽입되어 핵심 라인이 완성될 때까지 기다립니다.작업 대기열이 가득 찼지만 라인의 최대치에 도달하지 못하면 비핵심 라인을 시작해서 작업을 수행합니다 4.최대 스레드 수에 도달했을 때, 이 작업을 실행하는 것을 거부합니다. 리셋 방법으로 호출자에게 리셋합니다.
마지막으로 필요한 곳에서 다음과 같은 방법을 실행하면 스레드를 스레드 탱크에 넣고 실행할 수 있다.
        Runnable mRunnable = new Runnable() {
            @Override
            public void run() {
                // do someThing...
            }
        };
        mThreadPoolExecutor.execute(mRunnable);

좋은 웹페이지 즐겨찾기