(7)线程池

Executors

Executors 为工厂方法,方法如下:

//一个可缓存线程池
public static ExecutorService newCachedThreadPool();
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory);

//一个固定线程数量的线程池
public static ExecutorService newFixedThreadPool(int nThreads);
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory);

//一个定长线程池,支持定时及周期性任务执行
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize);
public static ScheduledExecutorService newScheduledThreadPool(
            int corePoolSize, ThreadFactory threadFactory);
            
//一个单线程化的线程池
public static ExecutorService newSingleThreadExecutor();
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory);

//一个单线程化的线程池,支持定时及周期性任务执行
public static ScheduledExecutorService newSingleThreadScheduledExecutor();
public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory);
  • newCachedThreadPool() 方法:该方法返回一个可根据实际情况调整线程数量的线程池。线程池的数量不确定,若有空闲线程可复用,则会优先使用复用线程。如果无复用线程,会创建新的线程。执行完毕后,放回线程池。核心线程数量为0,线程存活时间为 60秒,最大线程数量为 Integer.MAX_VALUE
  • newFixedThreadPool() 方法:该方法返回一个固定线程数量的线程池。该线程池中的线程数量始终不变。当有一个新的任务提交时,线程池中若有空闲线程,则立即执行。若没有,则新的任务会被暂存在一个任务队列中。核心线程、最大线程都是 固定线程数量。
  • newScheduledThreadPool() 方法:该方法返回一个 ScheduledExecutorService 类,可以定时循环执行任务,指定线程数量。
  • newSingleThreadExecutor() 方法:该方法返回一个只有一个线程的线程池。若多余一个任务被提交到该线程池,任务会被保存在一个任务队列中,待线程空闲,按先入先出的顺序执行队列中的任务。
  • newSingleThreadScheduledExecutor() 方法:一个单例的可循环执行的线程池,返回一个 ScheduledExecutorService 类。

工作队列

队列只能为 BlockingQueue ,可以使用如下几种 BlockingQueue

  • SynchronousQueue队列:直接提交队列,没有容量,每插入一个操作都要等待一个相应的删除操作。使用该队列,通常需要设置很大的最大线程。
  • ArrayBlockingQueue队列:有界的队列。
  • LinkedBlockingQueue队列:无界的队列。除非系统资源耗尽,否则不存在任务入队失败的情况。
  • PriorityBlockingQueue队列:优先任务队列。一个特殊的无界队列。ArrayBlockingQueueLinkedBlockingQueue 都是先进先出,但是 PriorityBlockingQueue 可根据任务自身的优先级顺序先后执行。

拒绝策略

拒绝策略

  • AbortPolicy 策略(默认策略):该策略会直接抛出异常,阻止系统正常工作。
  • CallerRunsPolicy 策略:只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的任务。显然这样做不会真的丢弃任务,但是,任务提交线程的性能极有可能会急剧下降。
  • DiscardOldestPolicy 策略:该策略将丢弃最老的一个请求,也就是即将被执行的一个任务,并尝试再次提交当前任务。
  • DiscardPolicy 策略:该策略默默地丢弃无法处理的任务,不予任何处理。如果允许任务丢失,该方案是最好的一个。

ThreadFactory

ThreadFactory 创建新的线程工厂,代码如下

public interface ThreadFactory {

    Thread newThread(Runnable r);

}

默认的 ThreadFactoryExecutors 中的 DefaultThreadFactory 代码如下:

    static class DefaultThreadFactory implements ThreadFactory {
        private static final AtomicInteger poolNumber = new AtomicInteger(1);
        private final ThreadGroup group;
        private final AtomicInteger threadNumber = new AtomicInteger(1);
        private final String namePrefix;

        DefaultThreadFactory() {
            SecurityManager s = System.getSecurityManager();
            group = (s != null) ? s.getThreadGroup() :
                                  Thread.currentThread().getThreadGroup();
            namePrefix = "pool-" +
                          poolNumber.getAndIncrement() +
                         "-thread-";
        }

        public Thread newThread(Runnable r) {
            Thread t = new Thread(group, r,
                                  namePrefix + threadNumber.getAndIncrement(),
                                  0);
            if (t.isDaemon())
                t.setDaemon(false);
            if (t.getPriority() != Thread.NORM_PRIORITY)
                t.setPriority(Thread.NORM_PRIORITY);
            return t;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值