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

全国旅游大型网站建设.net 做手机网站吗

全国旅游大型网站建设,.net 做手机网站吗,html论坛源码,免费高清大图网站#x1f648;作者简介#xff1a;练习时长两年半的Java up主 #x1f649;个人主页#xff1a;程序员老茶 #x1f64a; ps:点赞#x1f44d;是免费的#xff0c;却可以让写博客的作者开心好久好久#x1f60e; #x1f4da;系列专栏#xff1a;Java全栈#xff0c;… 作者简介练习时长两年半的Java up主 个人主页程序员老茶 ps:点赞是免费的却可以让写博客的作者开心好久好久 系列专栏Java全栈计算机系列火速更新中 格言种一棵树最好的时间是十年前其次是现在 动动小手点个关注不迷路感谢宝子们一键三连 目录 课程名Java内容/作用知识点/设计/实验/作业/练习学习JUC的线程池架构 JUC的线程池架构一、线程池的基本概念二、线程池的使用方法1. 创建线程池2. 提交任务到线程池3. 关闭线程池 三、线程池的核心组件1. ThreadPoolExecutor2. BlockingQueue3. 拒绝策略 四、自定义线程池示例1. 创建自定义线程池2. 使用自定义线程池 课程名Java 内容/作用知识点/设计/实验/作业/练习 学习JUC的线程池架构 JUC的线程池架构 本文主要介绍Java中如何使用java.util.concurrent包中的线程池ExecutorService和ThreadPoolExecutor来实现高并发、高可用的系统。我们将从线程池的基本概念、使用方法、核心组件以及自定义线程池四个方面进行阐述。 一、线程池的基本概念 线程池是一种管理线程的机制它可以有效地控制线程的数量避免大量线程之间的切换导致性能下降。线程池中的线程可以被复用当一个任务完成后线程不会被销毁而是被重新分配给新的任务。 二、线程池的使用方法 1. 创建线程池 在Java中可以通过Executors工具类来创建不同类型的线程池。例如创建一个固定大小的线程池 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class ThreadPoolDemo {public static void main(String[] args) {ExecutorService executorService Executors.newFixedThreadPool(5);} }2. 提交任务到线程池 使用submit()方法将任务提交到线程池中执行 executorService.submit(new Runnable() {Overridepublic void run() {System.out.println(任务执行中...);} });3. 关闭线程池 当所有任务都执行完毕后需要关闭线程池以释放资源 executorService.shutdown();三、线程池的核心组件 1. ThreadPoolExecutor ThreadPoolExecutor是ExecutorService接口的实现类它提供了更多的功能如定时执行、定期执行、异常处理等。我们通常需要自己实现一个ThreadPoolExecutor来满足业务需求。 2. BlockingQueue BlockingQueue是一个阻塞队列用于存放待处理的任务。它是一个FIFO先进先出的队列当队列满时新来的任务会等待当队列为空时正在执行的任务会等待。常用的阻塞队列有ArrayBlockingQueue、LinkedBlockingQueue和SynchronousQueue。 3. 拒绝策略 当线程池无法处理新提交的任务时需要采取一定的策略来处理这些任务。Java中的RejectedExecutionHandler接口提供了四种默认的拒绝策略 CallerRunsPolicy直接在调用者线程中运行任务。AbortPolicy抛出一个未检查异常中断任务。DiscardPolicy丢弃任务不做任何处理。DiscardOldestPolicy丢弃队列中最旧的任务尝试重新提交新任务。 我们可以根据实际需求自定义拒绝策略。例如下面是一个自定义的拒绝策略示例 import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.atomic.AtomicInteger;public class CustomRejectedExecutionHandler implements RejectedExecutionHandler {private static final int MAX_CAPACITY 100; // 最大容量private AtomicInteger rejectedCount new AtomicInteger(); // 被拒绝的任务计数器private ArrayBlockingQueueRunnable taskQueue; // 任务队列public CustomRejectedExecutionHandler() {taskQueue new ArrayBlockingQueue(MAX_CAPACITY); // 初始化任务队列}Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { // 拒绝策略实现方法if (taskQueue.remainingCapacity() 0) { // 如果队列已满添加拒绝策略executor.setRejectedExecutionHandler(new RejectedExecutionHandler() { // 设置新的拒绝策略Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { // 拒绝策略实现方法AbortPolicySystem.err.println(Task queue is full, rejecting task: r); // 输出错误信息并抛出异常AbortPolicythrow new RejectedExecutionException(Task queue is full, r); // 抛出RejectedExecutionException异常AbortPolicy}});} else { // 如果队列未满将任务添加到队列中并增加计数器CallerRunsPolicy或直接抛出异常DiscardPolicy/DiscardOldestPolicytaskQueue.put(r); // 将任务添加到队列中非阻塞rejectedCount.incrementAndGet(); // 被拒绝的任务计数器加1CallerRunsPolicy/DiscardPolicy/DiscardOldestPolicy或直接抛出异常DiscardPolicy/DiscardOldestPolicy}} }四、自定义线程池示例 下面我们通过一个示例来说明如何自定义线程池假设我们需要一个支持定时执行和周期性执行的任务线程池我们可以这样实现 要实现一个支持定时执行和周期性执行的任务线程池我们可以创建一个自定义的线程池类继承自ThreadPoolExecutor并重写其中的方法。以下是一个简单的示例 import java.util.concurrent.*;public class CustomThreadPoolExecutor extends ThreadPoolExecutor {private final long keepAliveTime;private final TimeUnit unit;public CustomThreadPoolExecutor(int corePoolSize, long keepAliveTime, TimeUnit unit) {super(corePoolSize);this.keepAliveTime keepAliveTime;this.unit unit;}Overrideprotected void beforeExecute(Thread t, Runnable r) {super.beforeExecute(t, r);// 在任务执行前执行的操作例如记录日志、初始化资源等}Overrideprotected void afterExecute(Runnable r, Throwable t) {super.afterExecute(r, t);// 在任务执行后执行的操作例如清理资源、记录日志等}public void scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) {super.scheduleAtFixedRate(command, initialDelay, period, unit);}public void scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) {super.scheduleWithFixedDelay(command, initialDelay, delay, unit);} }在这个示例中我们创建了一个名为CustomThreadPoolExecutor的自定义线程池类它继承自ThreadPoolExecutor。我们为这个类添加了两个方法scheduleAtFixedRate和scheduleWithFixedDelay分别用于定时执行和周期性执行任务。这两个方法内部调用了父类的相应方法来实现任务调度。 使用这个自定义线程池的示例代码如下 import java.util.concurrent.*;public class CustomThreadPoolExample {public static void main(String[] args) throws InterruptedException {CustomThreadPoolExecutor threadPool new CustomThreadPoolExecutor(2, 10, TimeUnit.SECONDS);for (int i 0; i 5; i) {final int taskId i;threadPool.execute(() - {System.out.println(Task taskId is running);try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Task taskId is completed);});}// 关闭线程池所有任务执行完成后线程池不再接受新任务threadPool.shutdown();} }在这个示例中我们创建了一个定时执行任务的线程池核心线程数为2任务间隔时间为10秒。然后我们提交了5个任务到线程池每个任务打印一条开始和结束信息并在运行过程中暂停1秒。由于线程池具有定时执行功能因此这些任务会按照设定的时间间隔依次执行。最后我们在所有任务执行完成后关闭线程池。 在Java中我们可以通过java.util.concurrent.Executors类创建线程池。然而有时候我们需要创建一个具有特定功能的线程池例如定时执行任务、周期性执行任务等。这时我们可以创建一个自定义的线程池来实现这些功能。本文将介绍如何创建一个自定义线程池并通过一个示例来演示其使用方法。 1. 创建自定义线程池 要创建一个自定义线程池我们需要实现java.util.concurrent.ThreadPoolExecutor接口并重写其中的方法。以下是一个简单的自定义线程池实现 import java.util.concurrent.*;public class CustomThreadPoolExecutor extends ThreadPoolExecutor {private final int corePoolSize;private final BlockingQueueRunnable workQueue;private final long keepAliveTime;private final TimeUnit unit;public CustomThreadPoolExecutor(int corePoolSize, BlockingQueueRunnable workQueue, long keepAliveTime, TimeUnit unit) {this.corePoolSize corePoolSize;this.workQueue workQueue;this.keepAliveTime keepAliveTime;this.unit unit;}Overrideprotected void beforeExecute(Thread t, Runnable r) {super.beforeExecute(t, r);// 在任务执行前执行的操作例如记录日志、初始化资源等}Overrideprotected void afterExecute(Runnable r, Throwable t) {super.afterExecute(r, t);// 在任务执行后执行的操作例如清理资源、记录日志等} }2. 使用自定义线程池 创建好自定义线程池后我们可以像使用普通的ThreadPoolExecutor一样使用它。以下是一个使用自定义线程池的示例 import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger;public class CustomThreadPoolExample {public static void main(String[] args) {// 创建一个定时执行任务的线程池CustomThreadPoolExecutor threadPool new CustomThreadPoolExecutor(2, new LinkedBlockingQueue(2), 30, TimeUnit.SECONDS);// 提交任务到线程池for (int i 0; i 5; i) {final int taskId i;threadPool.execute(() - {System.out.println(Task taskId is running);try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Task taskId is completed);});}// 关闭线程池所有任务执行完成后线程池不再接受新任务threadPool.shutdown();} }在这个示例中我们创建了一个定时执行任务的线程池最大容量为2任务队列大小为2空闲线程的存活时间为30秒。然后我们提交了5个任务到线程池每个任务打印一条开始和结束信息并在运行过程中暂停1秒。由于线程池具有定时执行功能因此这些任务会按照设定的时间间隔依次执行。最后我们在所有任务执行完成后关闭线程池。 往期专栏Java全栈开发数据结构与算法计算机组成原理操作系统数据库系统物联网控制原理与技术
http://www.hkea.cn/news/14276057/

相关文章:

  • 网站备案被注销了济南网站建站模板
  • 马鞍山做网站word发布wordpress
  • 电子商城网站开发合同网站建站建设上海黔文信息科技有限公司30
  • 沙井营销型网站建设企业登记代理公司
  • 温州专业网站制作公司山东金泰建设有限公司网站
  • 淘宝优惠券查询网站怎么做广安门外网站建设
  • 网站建设流程笔记优质服务的小企业网站建设
  • 互联网如何做旅游网站佛山网约车租赁公司
  • 个人网站可以做企业网站吗手机网站logo
  • 做凉菜的网站wordpress怎么缩短标题
  • 电子商务网站规划与建设试题网站建设研究背景
  • 网站开发与设计武威 网站建设
  • 公司网站制作的费用申请做爰视频网站在线看
  • 柳江企业网站建设价格软件技术属于什么学类
  • 男女做爰视频网站在线视频如何做网站免费搭桥链接
  • 做网站 绍兴展览公司网站建设
  • 网站修改图片怎么做龙岩相亲网
  • 湖南星大建设集团有限公司网站网店营销
  • 网站 建设 现状分析新冠怎么突然不见了
  • 做网站公司上班违法吗网站设计与程序方向
  • 西安商城网站建设网站专业术语中seo意思是
  • 成都电商网站开发网络做网站如何盈利
  • 制作企业网站页面多少钱wordpress js 调用图片
  • 网站开发技术应用领域thinkphp 做网站如何
  • 游戏网站建设论文简单漂亮的博客php网站源码
  • 医院网站建设安全协议哪个建站软件比较好带论坛
  • 怎么对网站做seo优化二维码生成器加logo
  • 没有固定ip做网站n怎样建立自己的网站
  • 怎么攻击网站吗旅游最新政策
  • 本人找做钢筋笼的活网站wordpress认证机制