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

做视频网站软件有哪些偃师网络营销的概念

做视频网站软件有哪些,偃师网络营销的概念,做网站用什么技术好,湖北网络科技有限公司原理概述 其实 Java 线程池的实现原理很简单#xff0c;说白了就是一个线程集合 workerSet 和一个阻塞队列 workQueue。 当用户向线程池提交一个任务时#xff0c;线程池会先将任务放入 workQueue 中。workerSet 中的线程会不断的从 workQueue 中获取线程然后执行。当 work…原理概述 其实 Java 线程池的实现原理很简单说白了就是一个线程集合 workerSet 和一个阻塞队列 workQueue。 当用户向线程池提交一个任务时线程池会先将任务放入 workQueue 中。workerSet 中的线程会不断的从 workQueue 中获取线程然后执行。当 workQueue 中没有任务的时候worker 就会阻塞直到队列中有任务了就取出来继续执行。 上图是一张线程池工作的精简图实际的过程比这个要复杂的多不过这些应该能够完全覆盖到线程池的整个工作流程了。 整个过程可以拆分成以下几个部分 1、提交任务 当向线程池提交一个新的任务时线程池有三种处理情况分别是创建一个工作线程来执行该任务、将任务加入阻塞队列、拒绝该任务。 提交任务的过程也可以拆分成以下几个部分 当工作线程数小于核心线程数时直接创建新的核心工作线程当工作线程数不小于核心线程数时就需要尝试将任务添加到阻塞队列中去如果能够加入成功说明队列还没有满那么需要做以下的二次验证来保证添加进去的任务能够成功被执行 验证当前线程池的运行状态如果是非RUNNING状态则需要将任务从阻塞队列中移除然后拒绝该任务验证当前线程池中的工作线程的个数如果为 0则需要主动添加一个空工作线程来执行刚刚添加到阻塞队列中的任务 如果加入失败则说明队列已经满了那么这时就需要创建新的“临时”工作线程来执行任务 如果创建成功则直接执行该任务如果创建失败则说明工作线程数已经等于最大线程数了则只能拒绝该任务了 整个过程可以用下面这张图来表示 2、创建工作线程 创建工作线程需要做一系列的判断需要确保当前线程池可以创建新的线程之后才能创建。 首先当线程池的状态是 SHUTDOWN 或者 STOP 时则不能创建新的线程。 另外当线程工厂创建线程失败时也不能创建新的线程。 还有就是当前工作线程的数量与核心线程数、最大线程数进行比较如果前者大于后者的话也不允许创建。 除此之外会尝试通过 CAS 来自增工作线程的个数如果自增成功了则会创建新的工作线程即 Worker 对象。 然后加锁进行二次验证是否能够创建工作线程最后如果创建成功则会启动该工作线程。 3、启动工作线程 当工作线程创建成功后也就是 Worker 对象已经创建好了这时就需要启动该工作线程让线程开始干活了Worker 对象中关联着一个 Thread所以要启动工作线程的话只要通过 worker.thread.start() 来启动该线程即可。 启动完了之后就会执行 Worker 对象的 run 方法因为 Worker 实现了 Runnable 接口所以本质上 Worker 也是一个线程。 通过线程 start 开启之后就会调用到 Runnable 的 run 方法在 run 方法中调用了 runWorker(this) 方法也就是把当前对象传递给了 runWorker 方法让他来执行。 4、获取任务并执行 在 runWorker 方法被调用之后就是执行具体的任务了首先需要拿到一个可以执行的任务而 Worker 对象中默认绑定了一个任务如果该任务不为空的话那么就是直接执行。 执行完了之后就会去阻塞队列中获取任务来执行而获取任务的过程需要考虑当前工作线程的个数。 如果工作线程数大于核心线程数那么就需要通过 poll 来获取因为这时需要对闲置的线程进行回收如果工作线程数小于等于核心线程数那么就可以通过 take 来获取了因此这时所有的线程都是核心线程不需要进行回收前提是没有设置 allowCoreThreadTimeOut 线程池到底是如何复用线程的 在 Java 当中每个 Thread 线程都有一个 start 方法在程序调用 start 方法启动线程时Java 虚拟机会调用该类的 run 方法。 在 Thread 类的 run 方法中其实调用了 Runnable 对象的 run 方法因此可以继承 Thread 类在 run 方法中不断循环调用传递进来的 Runnable 对象的 run 方法程序就会不断地执行 run 方法中的代码。 Java 线程池可以把线程和任务进行解耦线程归线程任务归任务摆脱了之前通过 Thread 创建线程时的一个线程必须对应一个任务的限制。在线程池中同一个线程可以从 BlockingQueue 中不断提取新任务来执行其核心原理在于线程池对 Thread 进行了封装并不是每次执行任务都会调用 Thread.start() 来创建新线程而是让每个线程去执行一个“循环任务”在这个“循环任务”中不停地检查是否还有任务等待被执行如果有则直接去执行这个任务也就是调用任务的 run 方法把 run 方法当作和普通方法一样的地位去调用相当于把每个任务的 run() 方法串联了起来所以线程数量并不增加。 在 execute() 方法中多次调用 addWorker() 方法把任务传入addWorker 方法会添加并启动一个 Worker。 这里的 Worker 是何方神圣呢Worker 可以理解为是对 Thread 的包装Worker 内部有一个 Thread 对象它正是最终真正执行任务的线程Worker 承担了任务执行者的角色添加到任务队列中的每一个 Task 对象Runnable的 run() 方法最终都是由 Worker 对象来执行的。实际上 Worker 对象本身既是一个 AQS 组件同时也是一个Runnable对象。 所以一个 Worker 就对应线程池中的一个线程addWorker 就代表增加线程。线程复用的逻辑实现主要在 Worker 类中的 run 方法里执行的 runWorker 方法中简化后的 runWorker 方法代码如下所示。 可以看出实现线程复用的逻辑主要在一个不停循环的 while 循环体中。 通过取 Worker 的 firstTask 或者通过 getTask 方法从 workQueue 中获取待执行的任务。直接调用 task 的 run 方法来执行具体的任务而不是新建线程。 在这里我们找到了最终的实现通过取 Worker 的 firstTask 或者 getTask方法从 workQueue 中取出了新任务并直接调用 Runnable 的 run 方法来执行任务也就是如之前所说的每个线程都始终在一个大循环中反复获取任务然后执行任务从而实现了线程的复用。 所以总结一下大概的整体执行结构图应当如下所示 从整体上看这是一种职责分离的设计思想Worker 是 Worker任务是任务它俩没必要纠缠在一起。 参考 Java线程池的工作原理Java 线程池的工作原理线程池实现“线程复用”的原理
http://www.zqtcl.cn/news/890439/

相关文章:

  • 微信小程序网站建设哪家好视频教学网站开发
  • 个人网站排行网站集约化后如何建设
  • 企业网站维护wordpress特效代码
  • 建设银行网站短信错误6次wordpress新主题去版权
  • 国外 配色网站天猫店购买交易平台
  • 网站推广广告词大全集网站和网络建设自查报告
  • 电子商务网站建设备案须知自己做的网站服务器在哪里
  • 怎样用wordpress做网站wordpress 首页判断
  • jsp做的网站效果织梦网站程序模板
  • 展示型网站设计公司网盘wordpress
  • 网站建设 保密学服装设计后悔了
  • 网站建设前端和后端网站开发所遵循的
  • 有自己域名的个人网站企业网站建设制作公司
  • 工程行业网站优化网站推广排名
  • 青岛网站建设软件下载广州app网站建设
  • 天津市建设厅官方网站qq电脑版登录
  • 贵阳手机网站建设公司辽源网站建设
  • 淄博网站设计制作wordpress 纯静态首页
  • 规划电子商务网站流程福清建设局网站简介
  • 使用joomla的网站网络营销师资格证有什么用
  • 做经营网站怎么赚钱吗关于做网站的合同
  • 上海手机网站建设哪家好重庆景点
  • 做网站菜单背景图片wordpress伪原创词库
  • 网络维护工程师工资多少聊城哪里做优化网站
  • 网站开发用什么字体查询域名备案
  • 济南品牌网站建设公司网站单个页面紧张搜索引擎蜘蛛
  • 公司需要一个简单的网站包头网站建设奥北
  • 怎么制作网站导航页新手做网站详细步骤
  • 自己个人网站后台怎么做wordpress多程序用户同步
  • 赣州网联科技有限公司wordpress安装后优化