当前位置: 首页 > news >正文

Java多线程10—如何使用线程池创建线程?

使用线程池创建多线程

文章目录

      • 使用线程池创建多线程

  • 背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程, 对性能影响很大。真正的开发中一般不会自己去一个一个的造线程,因为这样子的效率极差,一般都是使用线程池

  • 线程池:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交 通工具。

  • 好处:

  1. 提高响应速度(减少了创建新线程的时间)

  2. 降低资源消耗(重复利用线程池中线程,不需要每次都创建)

  3. 便于线程管理

    corePoolSize:核心池的大小

    maximumPoolSize:最大线程数

    keepAliveTime:线程没有任务时最多保持多长时间后会终止

  • JDK 5.0起提供了线程池相关API:ExecutorService 和 Executors

  • ExecutorService:真正的线程池接口。常见子类ThreadPoolExecutor

    1. void execute(Runnable command) :执行任务/命令,没有返回值,一般用来执行 Runnable
    2. Future submit(Callable task):执行任务,有返回值,一般又来执行 Callable
    3. void shutdown() :关闭连接池
  • Executors:工具类、线程池的工厂类,用于创建并返回不同类型的线程池

    1. Executors.newCachedThreadPool():创建一个可根据需要创建新线程的线程池
    2. Executors.newFixedThreadPool(n); 创建一个可重用固定线程数的线程池
    3. Executors.newSingleThreadExecutor() :创建一个只有一个线程的线程池
    4. Executors.newScheduledThreadPool(n):创建一个线程池,它可安排在给定延迟后运 行命令或者定期地执行。

代码详解(过程看代码注释)

package com.jsm.java3;


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

/*
创建线程的方式四:使用线程池
 */
public class ThreadPool {
    public static void main(String[] args) {
        //1.提供指定线程数量的线程池
        ExecutorService service = Executors.newFixedThreadPool(10);//造了一个线程池,里面有10个线程
            //  设置线程池的属性(这里service.不出属性,也.不出方法,因为这里是一个接口,接口属性比较少,就算有也是常量改不了)
        //要在接口的实现类去改
        //设置线程池的属性
        System.out.println(service.getClass());//getClass():来获取对象是哪一个类造的
        /*
        这里运行结果给是:ThreadPoolExecutor
        关系:1. ThreadPoolExecutor extends AbstractExecutorService 
        2.AbstractExecutorService extends Object implements ExecutorService
         可以看出关系,然后这里可以做一个强转
         */
        ThreadPoolExecutor s1=(ThreadPoolExecutor) service;
        //然后再用s1去点就可以设置属性了(这里体现了第三点,线程的管理)

        //2.执行指定线程的操作,需要提供实现Runnable接口或Callable接口实现类的对象
        service.execute(new NumberThread());//适合使用Runnable
        service.execute(new NumberThread1());//适合使用Runnable
//        service.submit();//适合使用于Callable
        //3.关闭线程池
        service.shutdown();
    }

}

class NumberThread implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }
    }
}
class NumberThread1 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {
            if (i % 2 != 0) {
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }
    }
}

相关文章:

  • python数据分析及可视化(七)pandas数据清洗,显性问题(异常、缺失、重复),隐形问题(离散、面元、字符串)
  • Java实现拼图小游戏(5)—— 美化界面(含源码阅读)
  • 【MySQL从入门到精通】【高级篇】(二十五)EXPLAIN中ref、rows、filtered、Extra字段的剖析
  • C语言数组详解
  • DS | 冲刺阶段考点整理 —— 绪论、线性表、栈与队列、特殊矩阵、串
  • 实验5 循环结构
  • 【漏洞复现-Apache-目录穿越文件读取-RCE】vulfocus/apache(cve_2021_41773)
  • 基于matlab的SVM支持向量机分类仿真,核函数采用RBF函数(提供matlab仿真录像)
  • 机器学习基础:拉格朗日乘子法
  • Matlab 与 Python 基于窗函数的滤波器设计对比 之 凯瑟窗
  • java web开发(从spring boot到spring cloud)
  • 看呆了!二面高德 Java 岗,问了一堆源码,微服务,分布式,Redis,心累
  • 2022华为杯研究生数学建模竞赛B题思路解析
  • 2022华为杯研究生数学建模竞赛E题思路解析
  • 【C语言】学生考勤管理系统
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 78. Subsets
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • AngularJS指令开发(1)——参数详解
  • Java 网络编程(2):UDP 的使用
  • JavaScript新鲜事·第5期
  • Java教程_软件开发基础
  • mysql innodb 索引使用指南
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Transformer-XL: Unleashing the Potential of Attention Models
  • Vue 重置组件到初始状态
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • yii2权限控制rbac之rule详细讲解
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 构建工具 - 收藏集 - 掘金
  • 机器学习学习笔记一
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 实现菜单下拉伸展折叠效果demo
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 与 ConTeXt MkIV 官方文档的接驳
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (九十四)函数和二维数组
  • (转)nsfocus-绿盟科技笔试题目
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .net专家(高海东的专栏)
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [C语言]——函数递归