zoukankan      html  css  js  c++  java
  • 高级线程之线程池

    高级线程之线程池

    1. 线程池产生

    为什么会出现线程池?
    在普通情况下,我们需要创建并启动一个线程,当任务完成时,我们将其销毁,这样存在两个不断重复的过程(创建和销毁)
    解决方案:我们创建一个线程池,当我们需要使用进程时,从进程池中调用一个,使用完时又将其返回线程池中,这样就避免了两个重复的过程

    2. 线程池的分类

    * 固定尺寸线程池
    
    //创建线程池
    ExcutorService tp=Excutor.newFixedThreadPool(N)  //N--线程池的大小(可用线程数目)
    Thread1 a= new Thread1();
    tp.execute(a);    //执行线程
    tp.shutdown();   //关闭线程池
    

    Q:写代码时可以execute超过n个线程吗?
    A:可以,但是由于线程池中只有两个待命线程,所以只有在其中一个线程结束后将其返回线程池才可运行第三个,后面的亦然

    * 可变尺寸线程池
    
    ExcutorService tp=Excutor.newCachedThreadPool();
    Thread1 a=new Thread1();
    tp.execute(a);
    tp.shutdown();
    

    3. 线程池的延迟执行

    //类
    ScheduledExecutorService //实现了时延功能的线程池
    //构造器
    public static ScheduledExecutorService newScheduledThreadPoll(int n)
    public static ScheduledExecutorService newSingleThreadScheduledExecutor()  //顾名思义,单线程线程池
    //API:
    public ScheduledFuture schedule(Runable command,long delay,TimeUnit unit)    //设定线程延迟执行时间
    

    4. 自定义线程池

    //类
    ThreadPoolExecutor
    //构造器
    public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runable> workQueue)
    //需要为这个类的对象指定两个值:标准尺寸和最大尺寸,原因在于线程调度的需要,如果请求线程数在最大值之内,都是原则上允许创建新线程的,如果要超过标准值,一般倾向于将请求放到队列中。
    
  • 相关阅读:
    SpringBoot打包的程序部署到服务器后一直在后台运行
    ubuntu搭建mysql数据库
    解决ubuntu16.04 ‘E: 无法获得锁 /var/lib/dpkg/lock-frontend
    项目部署篇之——下载安装Xftp6,Xshell6
    linux 文件 chgrp、chown、chmod
    linux 正确的关机方法
    linux 常用命令
    spring 事务
    Spring 中 ApplicationContext 和 BeanFactory 的区别
    java 异常处理
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/6901199.html
Copyright © 2011-2022 走看看