스 레 드 풀 을 알 아 보기 위해 간단 한 스 레 드 풀 을 만 듭 니 다.

본 고 는 내 가 인터넷 에서 사용자 정의 스 레 드 탱크 를 보고 스스로 수정 한 후에 안 드 로 이 드 에 사용 한 예 이다.
주로 스 레 드 탱크 의 실현 원 리 를 배운다.다음은 제 가 본 원문 주소 입 니 다.
http://blog.csdn.net/hsuxu/article/details/8985931
다음은 내 가 쓴 간단 한 스 레 드 탱크 이다.
테스트 코드
package com.example.administrator.executorthread;

import java.util.LinkedList;

/**
 * Created by Administrator on 2015/10/21.
 *          ,          
 */
public class MyExectorPool {
    private static final int DEFAULT_NUM = 5;//       
    private WorkThread[] workThreads;//         
    private final LinkedList<Runnable> queue = new LinkedList<>();//    
    private static MyExectorPool exectorPool;

    private MyExectorPool() {
        this(DEFAULT_NUM);
    }

    private MyExectorPool(int num) {
        workThreads = new WorkThread[num];
        for (int a = 0; a < num; a++) {
            workThreads[a] = new WorkThread();
            workThreads[a].start();
        }
    }

    /**
     *             
     *
     * @return MyExectorPool    
     */
    public static MyExectorPool getInstance() {
        if (exectorPool == null) {
            synchronized (MyExectorPool.class) {
                if (exectorPool == null) {
                    exectorPool = new MyExectorPool();
                }
            }
        }
        return exectorPool;
    }

    /**
     *     
     *    num       
     *
     * @param num      
     * @return MyExectorPool    
     */
    public static MyExectorPool getInstance(int num) {

        if (exectorPool == null) {
            synchronized (MyExectorPool.class) {
                if (exectorPool == null) {
                    if (num <= 0) {
                        num = DEFAULT_NUM;
                    }
                    exectorPool = new MyExectorPool(num);
                }
            }
        }
        return exectorPool;
    }

    /**
     *   
     *
     * @param task   
     */
    public void execute(Runnable task) {
        synchronized (queue) {
            queue.add(task);
            queue.notify();
        }
    }

    /**
     *      
     */
    public void destory() {
        for (WorkThread work : workThreads) {
            work.iSRunning = false;
        }
        workThreads = null;
    }

    /**
     *      ,      Runnable
     */
    private class WorkThread extends Thread {
        public boolean iSRunning = true;
        @Override
        public void run() {
            Runnable r = null;
            while (iSRunning) {
                synchronized (queue) {//            
                    if (!queue.isEmpty()) {
                        r = queue.remove(0);//      
                    }
                }
                if (r != null) {
                    r.run();
                }
                r = null;

            }

        }
    }
}

좋은 웹페이지 즐겨찾기