package threadpool_test;import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingDeque;import java.util.concurrent.TimeUnit;/** * 自定义一个简单的线程池 * * ***/public class ThreadPool { private static final int coreThreadNum=3;//核心线程数 private static final int maxThreadNum=8;//最大线程数 private boolean working=true;//打开、关闭线程池 private BlockingQueueworkThreads=new LinkedBlockingDeque<>(maxThreadNum);//当前工作线程 private BlockingQueue tasks=new LinkedBlockingDeque<>(10);//任务队列 public void execute(Runnable task) throws InterruptedException{ if(task==null) throw new NullPointerException(); int workNum=workThreads.size(); if(workNum
package threadpool_test;import java.util.concurrent.TimeUnit;/** * 测试类 * **/public class testMain {public static void main(String[] args) throws InterruptedException { ThreadPool pool=new ThreadPool(); for(int i=0;i<20;i++){ pool.execute(new Task("任务"+i)); } TimeUnit.SECONDS.sleep(4); pool.shutDown();}}
显示结果:
当前运行线程名:Thread-0当前任务名为:任务0当前运行线程名:Thread-2当前任务名为:任务2当前运行线程名:Thread-2当前任务名为:任务4当前运行线程名:Thread-2当前任务名为:任务5当前运行线程名:Thread-2当前任务名为:任务6当前运行线程名:Thread-2当前任务名为:任务7当前运行线程名:Thread-2当前任务名为:任务8当前运行线程名:Thread-2当前任务名为:任务9当前运行线程名:Thread-2当前任务名为:任务10当前运行线程名:Thread-2当前任务名为:任务11当前运行线程名:Thread-2当前任务名为:任务12开启新线程了Thread-3当前运行线程名:Thread-1当前任务名为:任务1当前运行线程名:Thread-1当前任务名为:任务14当前运行线程名:Thread-3当前任务名为:任务15当前运行线程名:Thread-3当前任务名为:任务16当前运行线程名:Thread-3当前任务名为:任务17当前运行线程名:Thread-3当前任务名为:任务18当前运行线程名:Thread-3当前任务名为:任务19当前运行线程名:Thread-0当前任务名为:任务3终止线程名:Thread-0真的终止了终止线程名:Thread-1终止线程名:Thread-2真的终止了真的终止了终止线程名:Thread-3终止线程池线程真的终止了
ps:该线程池功能非常之简单,仅为了加深线程池核心原理而做。里面关于任务队列满后的处理情况,在这里直接简单的使用放弃该任务的方法;