全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详谈Java几种线程池类型介绍及使用方法

一、线程池使用场景

•单个任务处理时间短

•将需处理的任务数量大

二、使用Java线程池好处

1、使用new Thread()创建线程的弊端:

•每次通过new Thread()创建对象性能不佳。

•线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。

•缺乏更多功能,如定时执行、定期执行、线程中断。

2、使用Java线程池的好处:

•重用存在的线程,减少对象创建、消亡的开销,提升性能。

•可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。

•提供定时执行、定期执行、单线程、并发数控制等功能。

Java四种线程池

Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。下面这张图完整描述了线程池的类体系结构:

1. newCachedThreadPool

创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。

public static ExecutorService newCachedThreadPool()

示例代码:

public class ThreadPoolExecutorTest {
   public static void main(String[] args ) {
    ExecutorService cacheThreadPool =Executors.newCachedThreadPool();
     for(int i =1;i<=5;i++){
       final int index=i ;
       try{
        Thread.sleep(1000);
      }catch(InterruptedException e ) {
         e.printStackTrace();
      }
       cacheThreadPool.execute(new Runnable(){
         @Override
         public void run() {
          System.out.println("第" +index +"个线程" +Thread.currentThread().getName());  
        }  
      });
    }
  }
}


//输出结果
第1个线程pool-1-thread-1
第2个线程pool-1-thread-1
第3个线程pool-1-thread-1
第4个线程pool-1-thread-1 第5个线程pool-1-thread-1  

由结果可看出 当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。

2. newFixedThreadPool

创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。

public static ExecutorService newFixedThreadPool(int nThreads)

nThreads - 池中的线程数

示例代码:

public class ThreadPoolExecutorTest {
   public static void main(String[] args) {
    ExecutorService fixedThreadPool =Executors. newFixedThreadPool(3);
     for (int i =1; i<=5;i++){
       final int index=i ;
       fixedThreadPool.execute(new Runnable(){
         @Override
         public void run() {
           try {
            System.out.println("第" +index + "个线程" +Thread.currentThread().getName());
            Thread.sleep(1000);
          } catch(InterruptedException e ) {
             e .printStackTrace();
          }
        }

      });
    }
  }
}

由于设置最大线程数为3,所以在输出三个数后等待2秒后才继续输出。

2. newScheduledThreadPool

创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)

corePoolSize - 池中所保存的线程数,即使线程是空闲的也包括在内。

延迟执行示例代码:

public class ThreadPoolExecutorTest {  
  public static void main(String[] args) {
    ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(3);   
    scheduledThreadPool.schedule(newRunnable(){     
      @Override 
      public void run() {
       System.out.println("延迟三秒");
       }
   }, 3, TimeUnit.SECONDS);
  }
}

表示延迟3秒执行。

定期执行示例代码:

public class ThreadPoolExecutorTest {  
  public static void main(String[] args) {

    ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(3);    
  scheduledThreadPool.scheduleAtFixedRate(newRunnable(){    
    @Override      
    public void run() {
       System.out.println("延迟1秒后每三秒执行一次");
     }
   },1,3,TimeUnit.SECONDS);
 }

}

表示延迟1秒后每3秒执行一次。

4.newSingleThreadExecutor

创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的 newFixedThreadPool(1)不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。

public static ExecutorService newSingleThreadExecutor()

示例代码:

public class ThreadPoolExecutorTest {  
  public static void main(String[] args) {
    ExecutorService singleThreadPool= Executors.newSingleThreadExecutor();    
    for(int i=1;i<=5;i++){      
      int index=i;      
    singleThreadPool.execute(new Runnable(){
       @Override
       public void run() {         
        try{
         System.out.println("第"+index+"个线程");
        Thread.sleep(2000);
         }catch(InterruptedException e) {            
          e.printStackTrace();
        }
      } });
    }
  }
}

以上这篇详谈Java几种线程池类型介绍及使用方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# java  # 线程池类型  # java线程池合理设置最大线程数和核心线程数方式  # Java实现终止线程池中正在运行的定时任务  # Java 线程池详解及实例代码  # 教你如何监控 Java 线程池运行状态的操作(必看)  # java中通用的线程池实例代码  # Java中四种线程池的使用示例详解  # 四种Java线程池用法解析  # Java使用线程池执行定时任务  # java简单实现多线程及线程池实例详解  # java线程池使用场景及一些建议  # 创建一个  # 是一个  # 第一个  # 池中  # 给大家  # 会有  # 多个  # 已有  # 其他的  # 长时间  # 系统资源  # 希望能  # 第二个  # 相互之间  # 几种  # 这篇  # 等功能  # 四种  # 量大  # 排在 


相关文章: 小型网站制作HTML,*游戏网站怎么搭建?  建站之星如何快速解决建站难题?  如何通过老薛主机一键快速建站?  定制建站流程步骤详解:一站式方案设计与开发指南  怎么将XML数据可视化 D3.js加载XML  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  免费网站制作appp,免费制作app哪个平台好?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  如何彻底卸载建站之星软件?  北京的网站制作公司有哪些,哪个视频网站最好?  建站之星代理商如何保障技术支持与售后服务?  建站主机解析:虚拟主机配置与服务器选择指南  C++如何使用std::optional?(处理可选值)  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  视频网站制作教程,怎么样制作优酷网的小视频?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  平台云上自助建站如何快速打造专业网站?  如何快速搭建FTP站点实现文件共享?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  建站之星后台密码如何安全设置与找回?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  如何通过商城免费建站系统源码自定义网站主题?    如何快速搭建高效可靠的建站解决方案?  婚礼视频制作网站,学习*后期制作的网站有哪些?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  javascript基本数据类型及类型检测常用方法小结  建站之星如何取消后台验证码生成?  如何在景安云服务器上绑定域名并配置虚拟主机?  如何在阿里云ECS服务器部署织梦CMS网站?  宝塔新建站点为何无法访问?如何排查?  高防服务器租用指南:配置选择与快速部署攻略  大学网站设计制作软件有哪些,如何将网站制作成自己app?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  建站主机与服务器功能差异如何区分?  成都网站制作报价公司,成都工业用气开户费用?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  如何用5美元大硬盘VPS安全高效搭建个人网站?  建站之星3.0如何解决常见操作问题?  模具网站制作流程,如何找模具客户?  建站主机选购指南:核心配置优化与品牌推荐方案  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  如何高效利用亚马逊云主机搭建企业网站?  如何获取免费开源的自助建站系统源码?  如何使用Golang table-driven基准测试_多组数据测量函数效率  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  建站之星伪静态规则如何设置?  电商平台网站制作流程,电商网站如何制作? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。