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

彩票开发网站建设应该要注意哪些问题兰州学校网站建设

彩票开发网站建设应该要注意哪些问题,兰州学校网站建设,做网站需要公司备案,河南省法制建设研究会网站线程池和ThreadLocal详解线程池池化模式#xff1a;线程池里的线程数量设定为多少比较合适?添加线程规则#xff1a;实现原理#xff1a;线程池实现任务复用的原理线程池状态#xff1a;Executors 创线程池工具类手动创建#xff08;更推荐#xff09;#xff1a;自动创… 线程池和ThreadLocal详解线程池池化模式线程池里的线程数量设定为多少比较合适?添加线程规则实现原理线程池实现任务复用的原理线程池状态Executors 创线程池工具类手动创建更推荐自动创建ExecutorService 执行线程池运行关闭其他execut() 执行流程钩子方法ThreadLocal优点创建使用场景一、每个线程需要一个独享的对象二、每个线程内需要保存全局变量例如在拦截器中获取用户信息原理注意内存泄漏如何避免内存泄露阿里规约)空指针异常线程池 java线程池是 JDK1.5提供 jucjava.util.concurrent包中底层实现其实就是 Callable 和 Future 接口 池化模式 将大量我们需要的对象提前创建好放在一个池概念对象提前创建完成也不需要销毁对象所以说使用效率比较好。 优点使用效率较好避免对象的 重复创建 和 销毁。缺点内存占有较高池的数量难以把控。 线程池里的线程数量设定为多少比较合适? CPU 密集型加密、计算hash等)︰最佳线程数为CPU核心数的 1-2 倍左右。耗时 IO 型读写数据库、文件、网络读写等︰最佳线程数一般会大于 CPU 核心数很多。参考 Brain Goetz 推荐的计算方法︰线程数 CPU核心数 * (1平均等待时间/平均工作时间) 添加线程规则 最开始线程总数小于 corePoolSize 时即使有线程处于空闲状态新任务到来时也会创建一个新线程。直到线程数等于 corePoolSize再来任务时会把任务放入队列去等待。直到队列也满了如果此时线程数小于 maximumPoolSize则会再创建新线程来执行任务。如果队列已满并且线程数已经扩大到等于 maximumPoolSize时再尝试添加任务时会被拒绝。 特点 若 corePoolSize maximumPoolSize则相当于 newFixedThreadPool()线程池希望保持较少的线程数并且只有在负载变得很大时才增加它。只有在队列填满时才创建多于corePoolSize的线程如果使用的是无界队列那么线程数就不会超过 corePoolSize。 实现原理 线程池组成部分 线程池管理器工作线程任务队列任务接口Task 线程池实现任务复用的原理 相同线程执行不同任务 不需要重复的启动线程循环的从队列中取出新任务并执行其 run() 方法。 线程池状态 RUNNING接受新任务 并 处理排队任务。SHUTDOWN不接受新任务但处理排队任务。STOP不接受新任务也不处理排队任务并中断正在进行的任务。TIDYING所有任务都已终止workerCount 为零时线程会转换到 TIDYING 状态并将运行 terminate() 钩子方法。 TERMINATEDterminate()钩子方法 运行完成。 Executors 创线程池工具类 根据情况我们创建很多种不同场景的线程池 Executors.new…();创建线程池返回 ExecutorService 类对象。 手动创建更推荐 new ThreadPoolExecutor(7个参数) 最原始的线程池所有其他的线程池底层都是用的此线程池实现的。 前 五个参数 为必须参数面试题经常考问 1、 corePoolSize核心线程数线程池中始终存活的线程数。 2、 maximumPoolSize最大线程数 线程池中允许的最大线程数当线程池的任务队列满了之后可以创建的最大线程数。 3、 keepAliveTime最大线程数可以存活的时间 如果线程池当前的线程数多于 corePoolSize那么如果多余的线程空闲时间超过 keepAliveTime它们就会被终止。 4、unit时间单位是和参数 3 存活时间配合使用的合在一起用于设定线程的存活时间 参数 keepAliveTime 的时间单位有以下 7 种可选 TimeUnit.DAYS天 TimeUnit.HOURS小时 TimeUnit.MINUTES分 TimeUnit.SECONDS秒TimeUnit.MILLISECONDS毫秒 TimeUnit.MICROSECONDS微妙 TimeUnit.NANOSECONDS纳秒 5、 workQueue一个阻塞队列用来存储线程池等待执行的任务均为线程安全它包含以下 7 种类型 ArrayBlockingQueue一个由数组结构组成的有界阻塞队列。LinkedBlockingQueue一个由链表结构组成的无界阻塞队列。SynchronousQueue直接交接一个不存储元素的阻塞队列即直接提交给线程不保持它们。PriorityBlockingQueue一个支持优先级排序的无界阻塞队列。DelayQueue延迟队列一个使用优先级队列实现的无界阻塞队列只有在延迟期满时才能从中提取元素。LinkedTransferQueue 一个由链表结构组成的无界阻塞队列与 SynchronousQueue 类似还含有非阻塞方法。LinkedBlockingDeque一个由链表结构组成的双向阻塞队列。 6、threadFactory线程工厂主要用来创建线程。 默认为正常优先级、非守护线程Executors.defaultThreadFactory()。创建出来的线程都在同一个线程组。如果自己指定 ThreadFactory那么就可以改变线程名、线程组、优先级、是否是守护线程等。 7、handler拒绝策略拒绝处理任务时的策略系统提供了 4 种可选 AbortPolicy默认策略拒绝并直接抛出异常。DiscardPolicy默默的丢弃任务不会通知。DiscardOldestPolicy丢弃队列中存在时间最久的任务。CallerRunsPolicy让提交任务的线程去执行。 优点不会放弃执行任务并且能够使提交任务的速度降低下来负反馈 很多公司都 【强制使用】 这个最原始的方式创建线程池因为这是可控的。 ThreadPoolExecutor threadPoolExecutor new ThreadPoolExecutor(500, 2000, 1, TimeUnit.MINUTES, new ArrayBlockingQueueRunnable());自动创建 Executors.newFixedThreadPool(int n)创建一个 可重用固定大小 的线程池可控制并发的线程数超出的线程会在队列中等待。 适用场景并发量不会发生变化并发量的变化非常小 new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueueRunnable());Executors.newCachedThreadPool([int n])创建一个 可缓存 的线程池。 若线程数超过处理所需缓存一段时间后会回收若线程数不够则新建线程。适用场景并发量变化比较明显建议使用此方法 new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueueRunnable());ScheduledExecutorService Executors.newScheduledThreadPool() 创建 延迟 后的线程池可以设置间隔。 返回 ScheduledExecutorService类 对象 schedule(Runnable command, long delay, TimeUnit unit)指定延迟时间后创建线程。scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) 在给定的初始延迟后首先启用然后根据间隔时间 period 执行。 (0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new DelayedWorkQueue());Executors.newSingleThreadExecutor() 单线程的线程池只会用唯一的工作线程来执行任务。 new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueueRunnable()));Executors.newWorkStealingPool()创建一个抢占式执行的线程池任务执行顺序不确定 注意此方法只有在 JDK 1.8 版本中才能使用。 ExecutorService 执行线程池 运行 execute(Runnable task)运行线程。submit()运行线程更加强大常用于创建Runnable匿名内部类 ExecutorService executor Executors.newFixedThreadPool(5); for (int i 0; i 10; i) {final int idx i;executor.submit(() - System.out.println(Thread.currentThread().getName() ————》 idx)); }关闭 shutdown()拒绝新任务等 正在执行 以及 阻塞队列 中的任务执行完毕后就停止线程池。isShutdown()判断线程池是否已经开始了关闭工作也就是是否执行了 shutdown 或者 shutdownNow 方法。。IsTerminated()判断线程池是否已经完全终止。正在执行、阻塞队列都已清空awaitTermination(long timeout, TimeUnit unit)检测在指定时间内此时当前线程阻塞线程池是否会完全终止。List Runnable shutdownNow()立刻完全停止线程池中断正在执行的线程并将阻塞队列里的线程返回。 线程 run() 方法在运行期间被中断会抛出 InterruptedException可以使用 catch 捕获。 其他 BlockingQueuegetQueue()获取阻塞队列 execut() 执行流程 public void execute(Runnable command) {if (command null)throw new NullPointerException();int c ctl.get();if (workerCountOf(c) corePoolSize) {if (addWorker(command, true))return;c ctl.get();}// 线程池正在运行且队列没满if (isRunning(c) workQueue.offer(command)) {int recheck ctl.get();// 线程停止运行了则删除任务并拒绝if (! isRunning(recheck) remove(command))reject(command);// 核心工作线程没有了创建一个空的核心工作线程else if (workerCountOf(recheck) 0)addWorker(null, false);}// 队列满了尝试添加额外线程此处 false 代表添加的是额外线程 最大线程数else if (!addWorker(command, false))reject(command); }钩子方法 在每个任务执行前后进行操作 例如日志、统计、暂停 继承自线程池 ThreadPoolExecutor 并重写构造器 可重写方法 beforeExecute()线程执行前的操作。afterExecute()线程执行后的操作。 示例实现线程池的暂停、恢复操作省略了构造器 public class PauseableThreadPool extends ThreadPoolExecutor {// 线程池是否处于暂停状态private boolean isPaused;private final ReentrantLock lock new ReentrantLock();private Condition unPaused lock.newCondition();public void pause() {lock.lock();try {isPaused true;} finally {lock.unlock();}}Overrideprotected void beforeExecute(Thread t, Runnable r) {super.beforeExecute(t, r);lock.lock();try {while (isPaused) {unPaused.await();}} catch (InterruptedException e) {throw new RuntimeException(e);} finally {lock.unlock();}}public void resume() {lock.lock();try {isPaused false;unPaused.notifyAll();} finally {lock.unlock();}} }ThreadLocal 在 JDK1.2 的版本中已经为线程对象提供了副本对象特点是每一个线程都 独立拥有 ThreadLocal 对象。 作用1在任何线程的方法中都可以轻松获取到该对象。 在 ThreadLocal 初始化时加入对象。 作用2让某个需要用到的对象在线程间隔离每个线程都有自己的独立的对象) 在线程中 set 对象。 ThreadLocal 不支持继承性 同一个 ThreadLocal 变量在父线程中被设置值后那么在子线程中是获取不到的。 InheritableThreadLocal 类是可以做到支持继承性。 优点 达到线程安全。不需要加锁提高执行效率。更高效地利用内存、节省开销。 相比于场景一每个任务都新建一个 SimpleDateFormat显然用 ThreadLocal 可以节省内存和开销 免去传参的繁琐 不需要每次都传同样的参数ThreadLocal使得代码耦合度更低更优雅 创建 一定要将 ThreadLocal 定义成 静态变量 staticThreadLocal 需要一个泛型 public static ThreadLocalString threadLocal1 new Thread(); public static ThreadLocalSimpleDateFormat threadLocal2 ThreadLocal.withInitial(() -new SimpleDateFormat(yyyy-MM-dd hh:mm:ss) ); // 初始化并设置值get()获取 ThreadLocal 中当前线程共享的变量的值。 在 线程开启或调用 remove()后第一次调用 get() 的时候会调用 initialValue() 来得到值。 remove()移除 ThreadLocal中当前线程共享的变量的值。 最后 一定 要移除值否则很容易出现 内存溢出。 initialValue()该方法会返回当前线程对应的 “初始值”这是一个延迟加载的方法。默认为 null。 ThreadLocal.withInitial()初始化 ThreadLocal 并设置 initialValue()。 set()设置 ThreadLocal 中当前线程共享的变量的值。 set 和 setInitialValue 结果都是调用 map.set只不过是起点和入口不一样。 public static ThreadLocalSimpleDateFormat threadLocal2 ThreadLocal.withInitial(() -new SimpleDateFormat(yyyy-MM-dd hh:mm:ss) ); Test void contextLoads() {ExecutorService executorService Executors.newFixedThreadPool(10);for (int i 0; i 1000; i) {final int finalI i;executorService.submit(() -System.out.println(threadLocal2.get().format(new Date(1000 * finalI))));}executorService.shutdownNow(); }使用场景 一、每个线程需要一个独享的对象 通常是工具类典型需要使用的类有 SimpleDateFormat 和 Random比喻∶教材只有一本一起做笔记有线程安全问题。复印后就没问题。示例 线程池有1000个线程每个线程都要使用 SimpleDateFormat 工具类若直接使用则会创建 1000 个工具类开销巨大。这时可以创建一个 static 的 SimpleDateFormat 对象让线程池的每个核心线程都使用这个静态对象就防止了重复的创建。 但是由于 SimpleDateFormat 类是线程不安全的会出现重复的计算结果。此时可能会想到通过加锁确实能使结果正确但这样同一时间就只有一个线程运行了那何必高并发呢 这时就可以使用 ThreadLocal 了让每个核心线程内部都有自己独有的 SimpleDateFormat 对象如图 public static ThreadLocalSimpleDateFormat threadLocal2 ThreadLocal.withInitial(() -new SimpleDateFormat(yyyy-MM-dd hh:mm:ss) ); Test void contextLoads() {ExecutorService executorService Executors.newFixedThreadPool(10);for (int i 0; i 1000; i) {final int finalI i;executorService.submit(() -System.out.println(threadLocal2.get().format(new Date(1000 * finalI))));}executorService.shutdownNow(); }二、每个线程内需要保存全局变量例如在拦截器中获取用户信息 可以让不同方法直接使用避免参数传递的麻烦 原理 ThreadLocal 底层是将 值 存放在线程的 ThreadLocalMap 中的。 通过 getMap(Thread.currentThread()) 获取 ThreadLocalMap 对象。 注意 内存泄漏 内存泄露为 程序在申请内存后无法释放已申请的内存空间一次内存泄露危害可以忽略但内存泄露堆积后果很严重无论多少内存,迟早会被占光广义并通俗的说就是不再会被使用的对象或者变量占用的内存 不能被回收就是内存泄露。 由于 ThreadLocalMap 继承了 WeakReference 类属于弱引用对象。 弱引用JVM进行垃圾回收时无论内存是否充足都会回收被弱引用关联的对象。在java中用java.lang.ref.WeakReference 类来表示。可以在缓存中使用弱引用。 ThreadLocalMap 的每个 Entry 都是一个对 key 的弱引用同时是一个对 value 的强引用。 正常情况下当线程终止保存在 ThreadLocal 里的 value 会被垃圾回收因为没有任何强引用了但是如果线程不终止(比如线程需要保持很久那么 key 对应的 value 就不能被回收因为有以下的 调用链: Thread — ThreadLocalMap —Entry ( key为null) — Value 因为 value 和 Thread 之间还存在这个强引用链路所以导致 value 无法回收就可能会出现 OOM ThreadLocalMap 也有相应的处理方法在 resize() 中扫描 key 为 null 的Entry并把对应的 value 设置为 null 但前提是得调用 map.set() 或 remove() 。 如果一个ThreadLocal 不被使用就可能导致value的内存泄漏 如何避免内存泄露阿里规约) 调用 remove 方法就会删除对应的 Entry 对象可以避免内存泄漏所以使用完 ThreadLocal 之后应该调用 remove方法。 空指针异常 在创建 ThreadLcal时泛型是 包装类如 Long而若获取 value 时接收返回值的对象只是基本数据类型时有可能会拆箱错误。 比如在 ThreadLocal 没有设置值时默认是 null而将 null 赋给 long就会 空指针异常。 若使用的是包装类 Long则不会空指针异常。 因此在接收 get() 返回值时不建议使用 基本数据类型。
文章转载自:
http://www.morning.pkfpl.cn.gov.cn.pkfpl.cn
http://www.morning.npfrj.cn.gov.cn.npfrj.cn
http://www.morning.dfkby.cn.gov.cn.dfkby.cn
http://www.morning.rytps.cn.gov.cn.rytps.cn
http://www.morning.gtqws.cn.gov.cn.gtqws.cn
http://www.morning.sjgsh.cn.gov.cn.sjgsh.cn
http://www.morning.sggzr.cn.gov.cn.sggzr.cn
http://www.morning.qxljc.cn.gov.cn.qxljc.cn
http://www.morning.kysport1102.cn.gov.cn.kysport1102.cn
http://www.morning.ie-comm.com.gov.cn.ie-comm.com
http://www.morning.trbxt.cn.gov.cn.trbxt.cn
http://www.morning.gfkb.cn.gov.cn.gfkb.cn
http://www.morning.wztlr.cn.gov.cn.wztlr.cn
http://www.morning.hxxwq.cn.gov.cn.hxxwq.cn
http://www.morning.rbkgp.cn.gov.cn.rbkgp.cn
http://www.morning.xxgfl.cn.gov.cn.xxgfl.cn
http://www.morning.ohmyjiu.com.gov.cn.ohmyjiu.com
http://www.morning.tymnr.cn.gov.cn.tymnr.cn
http://www.morning.mlyq.cn.gov.cn.mlyq.cn
http://www.morning.gcqkb.cn.gov.cn.gcqkb.cn
http://www.morning.ldcrh.cn.gov.cn.ldcrh.cn
http://www.morning.nbybb.cn.gov.cn.nbybb.cn
http://www.morning.fwkjp.cn.gov.cn.fwkjp.cn
http://www.morning.jfnlj.cn.gov.cn.jfnlj.cn
http://www.morning.nzkkh.cn.gov.cn.nzkkh.cn
http://www.morning.qrqdr.cn.gov.cn.qrqdr.cn
http://www.morning.wbysj.cn.gov.cn.wbysj.cn
http://www.morning.mnjyf.cn.gov.cn.mnjyf.cn
http://www.morning.cnkrd.cn.gov.cn.cnkrd.cn
http://www.morning.madamli.com.gov.cn.madamli.com
http://www.morning.nlffl.cn.gov.cn.nlffl.cn
http://www.morning.blfgh.cn.gov.cn.blfgh.cn
http://www.morning.mrbmc.cn.gov.cn.mrbmc.cn
http://www.morning.zrkws.cn.gov.cn.zrkws.cn
http://www.morning.rltsx.cn.gov.cn.rltsx.cn
http://www.morning.qwzpd.cn.gov.cn.qwzpd.cn
http://www.morning.lsfzq.cn.gov.cn.lsfzq.cn
http://www.morning.cflxx.cn.gov.cn.cflxx.cn
http://www.morning.lgmgn.cn.gov.cn.lgmgn.cn
http://www.morning.rfdqr.cn.gov.cn.rfdqr.cn
http://www.morning.skbkq.cn.gov.cn.skbkq.cn
http://www.morning.tdmgs.cn.gov.cn.tdmgs.cn
http://www.morning.nnwmd.cn.gov.cn.nnwmd.cn
http://www.morning.wbxtx.cn.gov.cn.wbxtx.cn
http://www.morning.rmxwm.cn.gov.cn.rmxwm.cn
http://www.morning.rxfbf.cn.gov.cn.rxfbf.cn
http://www.morning.ylqb8.cn.gov.cn.ylqb8.cn
http://www.morning.qzxb.cn.gov.cn.qzxb.cn
http://www.morning.wjhqd.cn.gov.cn.wjhqd.cn
http://www.morning.sypby.cn.gov.cn.sypby.cn
http://www.morning.tcfhs.cn.gov.cn.tcfhs.cn
http://www.morning.rlhgx.cn.gov.cn.rlhgx.cn
http://www.morning.ztnmc.cn.gov.cn.ztnmc.cn
http://www.morning.pkfpl.cn.gov.cn.pkfpl.cn
http://www.morning.dbcw.cn.gov.cn.dbcw.cn
http://www.morning.mcwrg.cn.gov.cn.mcwrg.cn
http://www.morning.yhgbd.cn.gov.cn.yhgbd.cn
http://www.morning.rgpsq.cn.gov.cn.rgpsq.cn
http://www.morning.fnrkh.cn.gov.cn.fnrkh.cn
http://www.morning.qbfwb.cn.gov.cn.qbfwb.cn
http://www.morning.wdwfm.cn.gov.cn.wdwfm.cn
http://www.morning.zymgs.cn.gov.cn.zymgs.cn
http://www.morning.qlsyf.cn.gov.cn.qlsyf.cn
http://www.morning.lrzst.cn.gov.cn.lrzst.cn
http://www.morning.lwcqh.cn.gov.cn.lwcqh.cn
http://www.morning.bzjpn.cn.gov.cn.bzjpn.cn
http://www.morning.wclxm.cn.gov.cn.wclxm.cn
http://www.morning.gcrlb.cn.gov.cn.gcrlb.cn
http://www.morning.jwgmx.cn.gov.cn.jwgmx.cn
http://www.morning.tmfm.cn.gov.cn.tmfm.cn
http://www.morning.jzmqk.cn.gov.cn.jzmqk.cn
http://www.morning.gsrh.cn.gov.cn.gsrh.cn
http://www.morning.sypby.cn.gov.cn.sypby.cn
http://www.morning.bnlsd.cn.gov.cn.bnlsd.cn
http://www.morning.mxftp.com.gov.cn.mxftp.com
http://www.morning.yqgny.cn.gov.cn.yqgny.cn
http://www.morning.ypktc.cn.gov.cn.ypktc.cn
http://www.morning.yxdrf.cn.gov.cn.yxdrf.cn
http://www.morning.zjcmr.cn.gov.cn.zjcmr.cn
http://www.morning.lynkz.cn.gov.cn.lynkz.cn
http://www.tj-hxxt.cn/news/267992.html

相关文章:

  • 企业网站推广17网站建设与管理学什么
  • 芜湖网站设计怎么给网站做反链
  • 建一个网站大概多少钱电商网站有哪些官网
  • 网站开发 后端青州网站建设优化排名
  • 营销型类型网站多少钱些网站商城注意事项
  • 无锡网站建设价格深圳设计师招聘
  • 网站后台编辑教程黄骅百度贴吧招聘
  • 长沙建设品牌网站眼科医院网站开发策划
  • 湖南营销型网站建设报价网站建设综合实训设计报告
  • iis6.1的网站建设及权限设置wordpress获取文章页id
  • 手机网站建设与制作旅游建设投资公司中网站
  • 虚拟邮箱注册网站网络规划设计师对应中级
  • 马关县住房和城乡建设局网站做网站数据需要的软件
  • 免费下载网站软件建筑工程网络教育网
  • 简单网站建设方案策划wordpress免费版
  • 网站开发者常见问题聊城网站建设费用
  • 高明网站建设哪家好鞋网站建设方案
  • 怎么做微信里的网站链接南山网站建设哪家便宜
  • 南方医科大学精品课程建设网站微网站建设网络
  • 怎么攻击php做的网站网站建设的具体奖罚措施
  • Zillah wordpress个人如何优化网站有哪些方法
  • 广州做网站 信科便宜新手怎么做网站内容维护
  • 什么亲子网站可以做一下广告网站顶部图片素材
  • 深圳公司手机网站制作导航网站怎么推广
  • 海尔网站建设目的html前端开发
  • 升级wordpress导入工具江苏网站优化
  • 温州新公司做网站网站地图的制作
  • wordpress付费阅读chajian济南优化网页
  • 境外网站搭建如何制作好自己的网站
  • 建设手机网站的方案个人网站带后台源码