實現線程池(二)最簡單的線程池

咱們首先實現一個能簡單執行任務的線程池,很明顯,這樣的線程池須要具有兩個要素,一個是工做線程,一個是任務隊列ide

//工做線程
private List<Thread> workers;
//任務隊列
private final BlockingQueue<Runnable> taskQueue;
複製代碼

工做線程用於執行具體的每個任務,而任務隊列負責接收要執行的任務。this

線程池實例化的時候,肯定線程池工做線程個數poolSize和最大容許接受任務的個數maxAcceptspa

public MyThreadPool(int poolSize, int maxAccept) {
    workers = new ArrayList<>(poolSize);
    taskQueue = new ArrayBlockingQueue<>(maxAccept);
    this.poolSize = poolSize;
    this.maxAccept = maxAccept;
}
複製代碼

工做線程在線程池的初始化方法中建立和啓動線程

public synchronized void init() {
    if(!inited) {
        for (int i = 0; i < this.poolSize; i++) {
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true) {
                        try {
                            //從任務隊列中取任務,而後執行
                            Runnable runnable = taskQueue.take();
                            runnable.run();
                        } catch (InterruptedException e) {
                        }
                    }
                }
            });
            workers.add(t);
            t.start();
        }
    } else {
        return;
    }
    inited = true;
}
複製代碼

線程池對外提供執行任務的方法code

public void execute(Runnable runnable) throws RejectException{
    if(this.taskQueue.size() < maxAccept) {
        this.taskQueue.add(runnable);
    } else {
        //線程池任務隊列滿了,拋出拒絕異常
        throw new RejectException();
    }
}
複製代碼

實例化線程池,並調用生命週期

public static void main(String[] args) {
    MyThreadPool myThreadPool = new MyThreadPool(5,50);
    myThreadPool.init();
    try {
        myThreadPool.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("任務被執行了");
            }
        });
    } catch (MyThreadPool.RejectException e) {
    }
}
複製代碼

以上,咱們實現了一個最簡單的線程池隊列

按照咱們上一章中提到的,一個完備的線程池除了任務的執行以外,還應該具有如下條件string

  • 線程的生命週期管理,主要包括建立和回收
  • 線程池的生命週期,初始化,執行,銷燬等

顯然,本例子中,並無完整地體現線程和線程池的生命週期,咱們實現的還有缺陷,下一章針對本部分進行完善。it

相關文章
相關標籤/搜索