线程池

先上个代码

public class ThreadPool {
    public static void main(String[] args) throws Exception{
        ExecutorService es1 = Executors.newCachedThreadPool();
        ExecutorService es2 = Executors.newSingleThreadExecutor();
        ExecutorService es3 = Executors.newFixedThreadPool(3);
        ExecutorService es4 = Executors.newScheduledThreadPool(2);

        ScheduledExecutorService es5 = Executors.newScheduledThreadPool(2);
        ScheduledFuture ss = es5.schedule(new MyCallAble(), 10, TimeUnit.SECONDS);
        Future<String> future=  es1.submit(new MyCallAble());

        while (true) {
            if(future.isDone()) {
                System.out.println(future.get());
                break;
            }
        }
       es1.shutdown();
    }
}

class MyCallAble implements Callable {

    @Override
    public String call() throws Exception {
        return "my callable";
    }
}
对于线程池ThreadPool而言,java提供了4种不同的线程池,分别为cacheThreadPool,singleThreadPool,fixedThreadPool,scheduledThreadPool
这4种线程池均存在于java.util.concurrent.*包下,使用Executors来创建,对于前三种而言
ExecutorService es1 = Executors.newCachedThreadPool();
ExecutorService es2 = Executors.newSingleThreadExecutor();
ExecutorService es3 = Executors.newFixedThreadPool(3);
使用 Future future = es.submit(new XXXX());来接收线程执行的结果,通过future.isDone()来判断是非执行完成,通过future.get()来获取执行结果(如果是callable类型的的线程)
对于定时任务线程池,则为 ScheduledExecutorService es5 = Executors.newScheduledThreadPool(2);
ScheduledFuture ss = es5.schedule(new MyCallAble(), 10, TimeUnit.SECONDS);//延迟10秒执行

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) 为前三种线程池的创建方法,corePoolSize为核心线程池的大小,maximumPoolSize 最大线程池的大小,keepAliveTime 空闲线程的存活时间,unit 时间单位,workQueue线程等待队列。
  (1)对于cacheThreadPool而言,该线程池为可缓存线程池,他的创建方法中,ThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.SECONDS,new SynchronousQueue<Runnable>())该线程池的线程等待队列为SynchronousQueue,它没有容量,是一个不存储元素的阻塞队列,会将任务直接交给线程执行,该线程池的线程数量是不做限制的,不会有队列等待,即为当一个任务到来时,如果现在有空闲的线程,则将任务交给其执行,如果没有空闲线程,则新建一个线程执行,且如果一个线程长时间空闲,60秒后会被回收掉,适合处理大量耗时较短的任务。

(2)对于FixedThreadPool而言,它是一个定长线程池,创建时需要指明n,表示有多少个线程,在创建方法中ThreadPoolExecutor(n,n,0,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runable>()),它的核心线程数和线程的总数是一样的,线程的存在时间是永久的,不会存在线程被回收的情况,除非线程池关闭,当所有的线程都被占用时,新的任务会进入等待队列中,但任务的执行是无序的。LinkedBlockingQueue是一个无界阻塞队列,当任务的创建速度大于线程的执行速度时,会有大量的任务阻塞在队列中,可会造成内存溢出,因此FixedThreadPool适用于服务瞬时高峰的情况,但如果高峰持续时间过长,会造成队列阻塞。

(3)SingleThreadPool是一个严格单线程池,内部只有一个核心线程,最大线程数也是1,可以保证所有任务在同一线程中严格按照顺序执行。

(4)ScheduledTreadPool是定时任务线程池,在创建时指定核心线程池的大小,它的创建函数为ScheduledThreadPoolExecutor(n),n为核心线程池的大小,它继承了ThreadPoolExecutor类,实质为调用了父类new ThreadPoolExecutor(n,Integer.Max_Vale,0,TimeUnit.MILLISECONDS,new DelayWorkQueue()),它常用来执行定时或周期性任务。DelayWorkQueue是一个无界延迟队列,其中的元素按照延迟时间的先后顺序被执行,延迟时间越短的任务越先被执行 

(5)newWorkStealingPool:创建一个拥有多个任务队列的线程池,可以减少连接数,创建当前可用cpu数量的线程来并行执行,适用于大耗时的操作,可以并行来执行

1.复用线程池中的线程,避免线程的重复创建和销毁而造成性能的过度消耗。

2.有效的控制线程池的最大并发数,避免对CPU的资源抢夺而造成阻塞。

3.对线程进行简单的管理,根据不同的情景使用不同的线程池,更好的为不同业务场景服务。

 

剩下的https://www.jianshu.com/p/f030aa5d7a28,等等接着写,时间有点晚了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值