Java线程池的使用
定义单例线程池:
class MyPool {
private static MyPool myPool = null;
private ThreadPoolExecutor threadPool=null;
private ScheduledThreadPoolExecutor scheduledPool=null;
public ThreadPoolExecutor getThreadPool() {
return threadPool;
}
public ScheduledThreadPoolExecutor getscheduledPool(){
return scheduledPool;
}
private int corePoolsize = 10;
private int maximumPoolsize = 20;
private long keepAliveTime =3;
private int scheduledPoolSize =10;
private static synchronized void create(){if(myPool == null)myPool = new MyPool();}
public static MyPool getInstance(){if(myPool == null)
create();
return myPool;
}
private MyPool(){
this.threadPool = new ThreadPoolExecutor(corePoolsize, maximumPoolsize,keepAliveTime, TimeUnit.SECONDS,new LinkedBlockingQueue<>(),new ThreadPoolExecutor.CallerRunsPolicy());
this.scheduledPool = new ScheduledThreadPoolExecutor(scheduledPoolSize);
}
}
创建线程池的主要参数说明:
-
corePoolSize(int):线程池中保持的线程数量,包括空闲线程在内。也就是线程池释放的最小线程数量界限。 -
maximumPoolSize(int): 线程池中嫩容纳最大线程数量。 -
keepAliveTime(long): 空闲线程保持在线程池中的时间,当线程池中线程数量大于 corePoolSize 的时候。 -
unit(TimeUnit枚举类): 上面参数时间的单位,可以是分钟,秒,毫秒等等。 -
workQueue(BlockingQueue): 任务队列,当线程任务提交到线程池以后,首先放入队列中,然后线程池按照该任务队列依次执行相应的任务。可以使用的 workQueue 有很多,比如:LinkedBlockingQueue 等等。 -
threadFactory(ThreadFactory类): 新线程产生工厂类。 -
handler(RejectedExecutionHandler类): 当提交线程拒绝执行、异常的时候,处理异常的类。该类取值如下:(注意都是内部类)ThreadPoolExecutor.AbortPolicy: 丢弃任务并抛出RejectedExecutionException 异常。ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务,重复此过程。ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务。
获取线程池并添加任务:
public static void main(String[] args) {
ThreadPoolExecutor pool1 = (ThreadPoolExecutor) Executors.newCachedThreadPool();
pool1.execute(() ->{
for(int i = 0; i < 100; i++)
System.out.println("Dog"+i);
}
);
pool1.execute(() ->{
for(int i = 0; i < 100; i++)
System.out.println("Cat"+i);
}
);
}

浙公网安备 33010602011771号