实现线程池
通过以下方法去实现自定义线程池:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
public class ThreadPool {
private static ThreadPoolExecutor executor = null;
static {
executor = new ThreadPoolExecutor(5, 10, 200,
TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5), new MyTaskThreadFactory(), new AbortPolicy()
);
executor.prestartCoreThread(); //预启动一个线程
// executor.prestartAllCoreThreads();//预启动corePoolSize个线程到线程池
}
public static void main(String[] args) {
System.out.println("线程池线程数: "+executor.getPoolSize());
for(int i = 0; i<15;i++){
System.out.println(executor.isShutdown());
executor.execute(new MyTask(i, "uno线程:"+i));
System.out.println("线程池线程数: "+executor.getPoolSize());
System.out.println("阻塞队列中线程数:" + executor.getQueue().size());
System.out.println("已执行完线程数:" + executor.getCompletedTaskCount());
}
executor.shutdown(); //关闭线程池
}
}
class MyTaskThreadFactory implements ThreadFactory{
private static String FACTORYNAME = "MYTASKFACTORY";
private static List<? super Thread> threadList = new ArrayList<>();
public void setFactoryName(String name){
FACTORYNAME = name;
}
@Override
public Thread newThread(Runnable r) {
synchronized (r) {
//这里可以自定义个Thread,用了处理在创建线程前后预处理
Thread t = new Thread(r, FACTORYNAME + threadList.size());
threadList.add(t);
return t;
}
}
}
class MyTask extends Thread {
private int num;
public MyTask(int i, String name) {
super(name);
this.num = i;
}
@Override
public void run() {
try {
System.out.println(this.getName() + ", 正执行task " + num);
Thread.sleep(2000);
} catch (Exception e) {
}
System.out.println(this.getName() + ", task " + num + " 执行完成");
}
}
本人才疏学浅,如有错误,烦请指出,谢谢!