首页 > 编程语言 >Java多线程(3):ThreadPool(下)

Java多线程(3):ThreadPool(下)

时间:2022-10-26 06:55:25浏览次数:49  
标签:10 程池 Java System ThreadPool 线程 println 多线程 out

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~

 

除了可以通过ThreadPoolExecutor自定义线程池外,同Stream API中的Collectors一样,多线程里的Executors类也提供了一组相关的线程池工具,可以直接拿来用,不用考虑用什么队列合适的问题。

Javac除了传统的四大线程池工具:

1、newFixedThreadPool定长线程池

2、newCachedThreadPool缓存线程池

3、newSingleThreadExecutor单线程线程池

4、newScheduledThreadPool任务调度线程池

还包括了Java8新增的newWorkStealingPool抢占式线程池,目前这个用的不多,还是以之前的四大类线程池为主。

 

newFixedThreadPool定长线程池,顾名思义,就是它的线程池的大小是固定的,好比一个水池只能装10个立方的水量,11个立方肯定就装不下了。在newFixedThreadPool定长线程池中,c=m(也就是corePoolSize = maximumPoolSize),默认为无界队列,用代码来示例:

// 定长线程池
ExecutorService service1 = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
    System.out.println("创建线程 " + i);
    service1.execute(() -> System.out.println("当前线程 " + Thread.currentThread().getName()));
}
service1.shutdown();

 

可以看到,虽然创建了10个线程,但始终只有3个在工作。定长线程池在实际中用的比较多,尤其是一些可估算工作量的任务时。它的程序流程图是这样的:

 

  

 

newCachedThreadPool缓存线程池不会限制池中的线程数量,可以无限往里增加,直到线程数量超出最大整数范围,一般不会用这种方式,因为可能会因为程序故障而把机器拖垮。代码也很简单:

// 缓存线程池
ExecutorService service2 = Executors.newCachedThreadPool();
for (int i = 0; i < 1_000_000_000; i++) {
    System.out.println("创建线程 " + i);
    service2.execute(() -> System.out.println("当前线程 " + Thread.currentThread().getName()));
}
service2.shutdown();

 

我希望创造10亿个线程,计算机照单全收。我花了很长时间,它都没有停下来的意思-_-!

所以我只好强制让它休息了。

 

 

 

它的程序流程图是这样的:

 

 

 

newSingleThreadExecutor单线程线程池是定长线程池的一个特例,它的线程池长度始终为1,也就是c=m=1,它的代码:

// 单线程线程池
ExecutorService service3 = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
    System.out.println("创建线程 " + i);
    service3.execute(() -> System.out.println("当前线程 " + Thread.currentThread().getName()));
}
service3.shutdown();

 

 

执行后可以看到,它始终只能创建一个线程。

 

最后一个是任务调度线程池,顾名思义,需要执行某些任务调度时可以用到,例如:3个线程每秒执行1次的(仅执行1次):

// 任务调度线程池
ScheduledExecutorService service4 = Executors.newScheduledThreadPool(3);
for (int i = 0; i < 10; i++) {
    // 延迟1秒后执行,仅执行1次
    service4.schedule(() -> System.out.println("当前线程 " + Thread.currentThread().getName()),
            1,
            TimeUnit.SECONDS);
}
service4.shutdown();

 

 

或者3个线程每3秒各执行1次的:

// 任务调度线程池
ScheduledExecutorService service5 = Executors.newScheduledThreadPool(3);
for (int i = 0; i < 10; i++) {
    // 延迟1秒后执行,每3秒执行1次
    service4.scheduleAtFixedRate(() -> System.out.println("当前线程 " + Thread.currentThread().getName()),
            1,
            3,
            TimeUnit.SECONDS);
}
service5.shutdown();

 

 

线程池的基本内容其实并不多,主要还是要在日常开发中实际使用,多用多练才能熟能生巧。

 

 

感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~

 

标签:10,程池,Java,System,ThreadPool,线程,println,多线程,out
From: https://www.cnblogs.com/xiangwang1111/p/16826394.html

相关文章

  • 没有Java开发环境的计算机中,在15分钟内完成一个“Helloworld”的Java程序
    一,下载JdK【1】打开浏览器,搜http://www.java.com/zh_CN搜索框“免费Java下载”进入下载页框(会有推荐下载)若版本不正确,点击"查看所有Java文件"选正确的版本......
  • 【Java技术总结】Spring事务失效总结
    事务方法必须是public,private、protected、default都会失效。@ServicepublicclassUserService{@Transactionalprivatevoidadd(UserModeluserModel){......
  • 多日Java小结
    今天已经是学习Java的第12天了,但是总觉得自己的进度真的很慢,现在还没学到循环,但是感觉前面的知识依然还没有消化,所以先小结一下吧。 首先,记住了Java的基本格式,publicst......
  • Javaweb基础复习------EL表达式+JSTL-if&foreach
    EL表达式------简化JSP页面的Java代码主要功能是------获取数据(语法:${data})举例://ServletDemo1.javapackagecom.example.servlet;importcom.example.pojo.User;i......
  • 使用 JSTL 报错:javax/servlet/jsp/tagext/TagLibraryValidator
    jsp使用jstl,访问页面之后报错,如上图所示。我的Tomcat版本是10.0,导入的jstl是javax.servlet下的,应该导入以下几个包:<dependency><groupId>mysql</groupId>......
  • JavaScript实现 -- 顺序搜索
    顺序搜索顺序搜索是一种寻找某一特定值的搜索算法,按一定的顺序检查数组中每一个元素,直到找到所要寻找的特定值为止。顺序搜索是最简单的一种搜索算法。思路遍历数组,并对......
  • java反射机制的作用
    反射(Reflection)是Java程序开发语言的特征之一,它允许运行中的Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性和方法。反射是一项高级开发人员应该......
  • Java的碎碎念(2)
    p21:1.2软件开发介绍常用的DOS命令(windows+Rcmd)>dir:列出当前目录下的文件以及文件夹>md:创建目录>rd:删除目录>cd:进入指定目录>cd.:退回到上一级目录>cdl:退回到根目录......
  • Java碎碎念(3)
    P24:1.5 Java语言的环境搭建什么是JDK,JREJDK(JavaDevelopmentKitJava开发工具包)JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE。所以安装了J......
  • Java碎碎念(三,hello world + 注释)
    windows不区分大小写且区别中英文java区分大小写 第一个代码文件:classHelloChina{         publicstaticvoidmain(String[]args){   ......