千家信息网

Java线程池的使用方法

发表于:2025-01-28 作者:千家信息网编辑
千家信息网最后更新 2025年01月28日,本篇内容主要讲解"Java线程池的使用方法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java线程池的使用方法"吧!在任务与执行策略之间的隐形耦合依赖任
千家信息网最后更新 2025年01月28日Java线程池的使用方法

本篇内容主要讲解"Java线程池的使用方法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java线程池的使用方法"吧!

在任务与执行策略之间的隐形耦合

依赖任务

使用线程封闭机制的任务

对相应时间敏感的任务

使用ThreadLocal的任务

在线程池中,如果任务依赖于其他任务,那么可能产生死锁。

程序清单8-1 在单线程中任务发生死锁

public class ThreadDeadLock {    Executor executor = Executors.newSingleThreadExecutor();    public class RenderPageTask implements Callable {        @Override        public String call() throws Exception {            Future header, footer;            header = executor.execute(new LoadFileTask("header.html"));            footer = executor.execute(new LoadFileTask("footer.html"));                        String page = renderBody();            //将发生死锁 -- 由于任务在等待子任务的结果            return header.get() + page + footer.get();        }    }}

每当提交一个有依赖性的Executor任务时,要清楚地知道可能会出现线程"饥饿"死锁,因此需要在代码或配置Executor的配置文件中记录线程池的大小限制或配置限制。

除了在线程池大小上的显示限制外,还可能由于其他资源上的约束而存在一些隐式限制。如果应用程序使用一个包含10个连接的JDBC连接池,并且每个任务需要一个数据库连接,那么线程池就好像只有10个线程,因为当超过10个任务时,新的任务需要等待其他任务释放连接。

运行时间较长的任务

设置线程池的大小

配置ThreadPoolExecutor

ThreadPoolExecutor是线程池的真正实现,它构造方法提供了一系列参数来配置线程池。

public ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory) {...}public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHander hander) {...}

corePoolSize--线程池的核心线程数,默认情况下,核心线程会在线程池中一直存活,即使他们处于限制状态。如果将ThreadPoolExecutor的allowCoreThreadTimeOut属性

设置为true,那么闲置的线程核心线程在等待新任务到来时会有超时策略,这个时间间隔由keepAliveTime所指定,当等待时间超出keepAliveTime所指定的时长后,核心线程就会被终止。

maximumPoolSize--线程池所能容纳的最大线程数,当活动线程数达到这个数值后,后续的新任务将会被阻塞。

keepAliveTime--非核心线程闲置的超时时长,超过这个时长,非核心线程就会被回收。当ThreadPoolExecutor的属性allowCoreThreadTimeOut值为true时,keepAliveTime也作用于核心现程。

unit--用于指定keepAliveTime时间参数的单位,这是一个枚举,常用的有TimeOut.MILLISECONDS(毫秒)、TimeOut.SECONDS(秒)以及TimeOut.MINUTES(分钟)等。

workQueue--线程池中的任务队列,通过线程池的executor方法提交的Runnable对象会存储在这个参数中。

threadFactory--线程工厂,为线程池提供创建新线程的功能。ThreadFactory是一个接口,它只有一个方法:Thread newThread(Runnable r);

hander--不常用就不做介绍了。

ThreadPoolExecutor执行任务时大致遵循如下规则:

1 如果线程池中的线程数未达到核心数量,那么会直接启动一个核心线程来执行任务。

2 如果线程池中的线程数已达到或者超过核心数量,那么任务会被插入到任务队列中排队等待执行。

3 如果在步骤2中无法将任务插入到任务队列中,这往往是由于任务队列已满,这个时候如果线程数量未达到线程规定的最大值,那么会立刻启动一个非核心线程来执行任务。

4 如果步骤3中线程数量已经达到线程池规定的最大值,那么就拒绝执行任务,ThreadPoolExecutor会调用RejectedExecutionHander的rejectedExecution方法来通知调用者。

到此,相信大家对"Java线程池的使用方法"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

线程 任务 方法 核心 时间 配置 限制 数量 队列 死锁 使用方法 最大 参数 大小 时长 非核 内容 只有 属性 常用 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 软件开发好找工作 泉州鲜奈网络技术有限公司 浙江卓尔软件开发 创造与魔法168服务器能拆家吗 医院网络技术设计方案 河北手机软件开发价格如何计算 国美易卡服务器什么时候能升级好 目前最流行的软件开发 物联网对网络技术发展的影响 经济数据库介绍讲座感想 数据库和数据库系统的相同处 大学法治展馆软件开发 网络安全内文字框要写啥 思度软件开发 完美世界经典服务器大全 专业软件开发人员外包价位 数据库的安全性完整性并发控制 工程师职称证书软件开发专业 gpu 计算 服务器 电脑与服务器断开怎么修复 流量型攻击是网络安全问题吗 异种服务器连接错误 明日之后远星城服务器分布 git客户端 服务器 增强网络安全手抄报 万方数据库怎么传文档 中国网络安全管理局官网 软件开发移民 专业工具软件开发费用 项城市国家网络安全宣传
0