怎样免费做书画网站旅游网站设计图片

张小明 2026/1/10 18:02:15
怎样免费做书画网站,旅游网站设计图片,推广文章的注意事项,自己搭建聊天平台1. jdk源码 大家可以多看源码#xff0c;看一下同样的功能#xff0c;代码是如何构造的#xff1b; ThreadpoolExector1.1线程池 我们通常所说的线程池是指Java中的ThreadPoolExecutor#xff0c;下面将详细说明线程池的参数、实现原理以及如何实现一个简单的线程池。 线程…1. jdk源码大家可以多看源码看一下同样的功能代码是如何构造的ThreadpoolExector1.1线程池我们通常所说的线程池是指Java中的ThreadPoolExecutor下面将详细说明线程池的参数、实现原理以及如何实现一个简单的线程池。线程池的参数以ThreadPoolExecutor为例ThreadPoolExecutor有7个核心参数corePoolSize核心线程数线程池中保持存活的最小线程数即使它们处于空闲状态。maximumPoolSize最大线程数线程池中允许存在的最大线程数。keepAliveTime线程存活时间当线程数超过核心线程数时多余的空闲线程在终止前等待新任务的最长时间。unit时间单位keepAliveTime的时间单位。workQueue工作队列用于保存等待执行的任务的阻塞队列。threadFactory线程工厂用于创建新线程的工厂。handler拒绝策略当线程池和工作队列都满了说明线程池处于饱和状态必须采取一种策略处理新提交的任务。线程池的实现原理线程池的主要工作流程如下提交任务后线程池首先判断当前线程数是否小于核心线程数corePoolSize。如果是则创建一个新线程来执行任务。如果当前线程数已经达到核心线程数则将任务放入工作队列workQueue中。如果工作队列已满且当前线程数小于最大线程数maximumPoolSize则创建新的线程来执行任务。如果当前线程数已经达到最大线程数并且工作队列已满则按照拒绝策略handler处理新提交的任务。线程池中的线程执行完任务后会从工作队列中获取新的任务来执行。如果超过keepAliveTime仍然没有获取到新任务并且当前线程数大于核心线程数则该线程会被终止直到线程数等于核心线程数。拒绝策略详解Java提供了4种内置拒绝策略AbortPolicy直接抛出RejectedExecutionException默认CallerRunsPolicy由调用者线程执行该任务DiscardPolicy直接丢弃任务不抛异常DiscardOldestPolicy丢弃队列中最老的任务然后重试执行FixedThreadPool固定大小线程池CachedThreadPool缓存线程池SingleThreadExecutor单线程线程池ScheduledThreadPool定时任务线程池WorkStealingPool工作窃取线程池Java 8ForkJoinPool分治线程池与WorkStealingPool相关下面分别介绍这些线程池的特点和适用场景。1. FixedThreadPool固定大小线程池创建方法Executors.newFixedThreadPool(int nThreads)特点核心线程数和最大线程数相等即固定大小的线程池。线程池中的线程不会因为任务过多而扩容也不会因为空闲而收缩。任务队列使用无界队列LinkedBlockingQueue。适用场景适用于负载较重的服务器需要限制当前线程数量以及需要稳定线程数的场景。2. CachedThreadPool缓存线程池创建方法Executors.newCachedThreadPool()特点核心线程数为0最大线程数为Integer.MAX_VALUE线程空闲存活时间为60秒。任务队列使用同步队列SynchronousQueue该队列不存储元素每个插入操作必须等待另一个线程的移除操作。因此如果有空闲线程则复用如果没有则创建新线程。线程池的线程数可以无限扩大当线程空闲时会被回收。适用场景适用于执行很多短期异步任务或者负载较轻的服务器。3. SingleThreadExecutor单线程线程池创建方法Executors.newSingleThreadExecutor()特点只有一个线程的线程池核心线程数和最大线程数均为1。任务队列使用无界队列LinkedBlockingQueue。保证所有任务按顺序执行。适用场景适用于需要顺序执行任务的场景并且不需要并发执行。4. ScheduledThreadPool定时任务线程池创建方法Executors.newScheduledThreadPool(int corePoolSize)特点可以执行定时任务和周期性任务。核心线程数由参数指定最大线程数为Integer.MAX_VALUE线程空闲存活时间为0但实际上由于用于调度任务所以不会回收核心线程。任务队列使用延迟工作队列DelayedWorkQueue。适用场景适用于需要执行定时任务和周期性任务的场景。5. WorkStealingPool工作窃取线程池创建方法Executors.newWorkStealingPool(int parallelism) parallelism并行级别默认为CPU核数。特点基于ForkJoinPool实现使用工作窃取算法即每个线程维护自己的任务队列当自己队列中的任务执行完后可以从其他线程的任务队列中“窃取”任务来执行。这种机制可以减少线程间的竞争提高吞吐量。适用场景适用于任务执行时间不均匀或者有大量子任务的场景。6. ForkJoinPool分治线程池创建方法new ForkJoinPool(int parallelism)特点与WorkStealingPool类似也是基于工作窃取算法。ForkJoinPool是WorkStealingPool的底层实现但WorkStealingPool是ForkJoinPool的封装调整了一些默认参数。ForkJoinPool适合处理可以递归分解的任务分治任务。适用场景适用于计算密集型任务且任务可以分解成更小的子任务。注意事项FixedThreadPool和SingleThreadExecutor使用无界队列如果任务提交速度大于处理速度可能会堆积大量任务导致内存溢出。CachedThreadPool和ScheduledThreadPool的最大线程数很大如果任务提交过多可能会创建大量线程导致资源耗尽。因此在实际使用中通常建议根据业务场景自定义线程池参数使用ThreadPoolExecutor构造函数来创建以便更精确地控制线程池的行为。常见配置建议CPU密集型线程数 ≈ CPU核数IO密集型线程数 ≈ CPU核数 × (1 平均等待时间/平均计算时间)混合型根据实际情况调整//中断空闲的线程 private void interruptIdleWorkers(boolean onlyOne){final ReentrantLock mainLockthis.mainLock;//专用锁 mainLock.lock();//添加专用锁 try{for(Worker w:workers){Thread tw.thread;if(!t.isInterrupted()w.tryLock()){try{t.interrupt();//阻塞当前线程}finally{w.unlock();}}if(onlyOne)break;}}finally{mainLock.unlock();//解除专用锁代码}}public booleantryLock(){returnthis.tryAcquire(1);}protected boolean tryAcquire(int unused){if(this.compareAndSetState(0,1)){//cas线程安全 this.setExclusiveOwnerThread(Thread.currentThread());returntrue;}else{returnfalse;}}public voidunlock(){this.release(1);}public final boolean release(int arg){if(tryRelease(arg)){signalNext(head);returntrue;}returnfalse;}protected boolean tryRelease(int unused){setExclusiveOwnerThread(null);setState(0);returntrue;}// setExclusiveOwnerThread(Thread.currentThread());线程非安全但是由于有cas锁机制是线程安全的;protected boolean tryAcquire(int unused){if(compareAndSetState(0,1)){setExclusiveOwnerThread(Thread.currentThread());returntrue;}returnfalse;}protected boolean tryRelease(int unused){this.setExclusiveOwnerThread((Thread)null);this.setState(0);returntrue;}//若 tryAcquire 和 tryRelease分别两个专项锁则可能出现线程安全的问题;设计规则上是 若 tryAcquire 和 tryRelease 一块使用 关键因素 ReentrantLock 机制保障 两个方法都在 ReentrantLock 的同步机制控制下 tryAcquire 和 tryRelease 方法的调用都受到同一把锁的保护 互斥访问 ReentrantLock 确保同一时刻只有一个线程能执行临界区代码 无论是获取锁还是释放锁都是在受保护的上下文中进行 内存可见性 ReentrantLock 的获取和释放操作建立了 happens-before 关系 保证了 setExclusiveOwnerThread 操作的内存可见性 源码方法 private volatile ThreadFactory threadFactory;/** * Sets the thread factory used to create new threads. * * param threadFactory the new thread factory * throws NullPointerExceptionifthreadFactory is null * see#getThreadFactory*/ public void setThreadFactory(ThreadFactory threadFactory){Objects.requireNonNull(threadFactory,threadFactory);this.threadFactorythreadFactory;//线程安全单独的赋值操作}/** * Initiates an orderlyshutdowninwhichpreviously submitted * tasks are executed, but no new tasks will be accepted. * Invocation has no additional effectifalready shut down. * *pThis method does notwaitforpreviously submitted tasks to * complete execution. Use{link#awaitTermination awaitTermination}* todothat. */ public voidshutdown(){//关闭线程池 final ReentrantLock mainLockthis.mainLock;mainLock.lock();try{//如下多个操作复合操作需要 手动方式枷锁 advanceRunState(SHUTDOWN);interruptIdleWorkers();onShutdown();// hookforScheduledThreadPoolExecutor 钩子函数}finally{mainLock.unlock();}tryTerminate();}
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

安庆市建设局网站怎样建一个好的网站

Perl编程入门指南 1. 代码块与语句 在Perl中,代码块(如循环或条件语句分支内的代码)用花括号 {} 表示。例如,下面是一个无限循环的示例: #!/usr/bin/perl # a block of code to print a greeting forever while (1) {print “hello there\n”; };Perl语句以分号 ; …

张小明 2026/1/3 2:37:26 网站建设

云南网站建设哪家便宜wordpress摄影模板

工业自动化中的“电力管家”:电源管理芯片如何默默守护系统稳定? 你有没有想过,一台高速运转的工业机器人、一条24小时不停歇的智能产线,它们背后真正支撑其持续运行的“隐形英雄”是谁?不是PLC,也不是伺服…

张小明 2025/12/29 20:43:02 网站建设

家居企业网站建设方案舟山建设信息港

第一章:Open-AutoGLM本地化部署实战(专家级避坑手册) 环境准备与依赖管理 部署 Open-AutoGLM 前需确保系统具备完整的 Python 环境与 GPU 支持。推荐使用 Conda 创建独立环境,避免依赖冲突。 安装 Miniconda 或 Anaconda 并初始…

张小明 2026/1/7 20:58:22 网站建设

泉州app网站开发价格it培训网站

终极Android架构实践指南:从零构建模块化应用 【免费下载链接】android-showcase igorwojda/android-showcase: 是一个用于展示 Android 开发技巧和最佳实践的项目集合,包括了多种 Android 开发工具和技巧,可以用于学习 Android 开发知识。 …

张小明 2026/1/8 15:57:24 网站建设

四川人防工程建设网站国家高新技术企业认定标准

Miniconda VSCode远程开发:高效调试大模型Token生成 在大模型研发日益深入的今天,一个常见的场景是:你在本地笔记本上写代码,却无法运行哪怕是最小版本的 Llama 模型——显存不够、依赖冲突、环境不一致……最终只能靠 print 和日…

张小明 2026/1/6 22:43:43 网站建设

建立网站的意义企业展厅设计公司图片

1.头文件#include <sys/stat.h>2.函数原型int lstat(const char *pathname, struct stat *statbuf);3.参数pathname&#xff1a;符号链接的路径statbuf&#xff1a;执行struct stat结构的指针&#xff0c;用来存储符号链接的状态信息。4.返回值返回值&#xff1a;成功返回…

张小明 2026/1/10 9:11:06 网站建设