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

山东莱州市建设局网站免费加精准客源

山东莱州市建设局网站,免费加精准客源,电力行业做的好的招投标网站,怎样开电商线上店一、先说结论 得看线程池的实现,JUC 的线程池(ThreadPoolExecutor)的话 不会影响其他的线程若是 submit 方法,或者任务为 future 任务,异常只有在 get 的时候才会抛出若是 execute runnable 任务,异常就…

一、先说结论

得看线程池的实现,JUC 的线程池(ThreadPoolExecutor)的话

  1. 不会影响其他的线程
  2. 若是 submit 方法,或者任务为 future 任务,异常只有在 get 的时候才会抛出
  3. 若是 execute + runnable 任务,异常就会抛出,线程挂掉后,线程池移除该线程并创建一个新的线程

若通过 submit 提交任务,会将任务封装到 future 里面或者原任务本身就是 future 任务,而 future 的 run 方法执行的时候,抛出的异常在其内部会被捕获,等到 get 方法的时候才会抛出。

execute + runnable,并没有涉及 future,虽然异常会被捕获,但也以为被重新抛出,导致线程中断,线程池需要移除线程,并创建新的线程

二、submit、execute 方法

在这里插入图片描述

在这里插入图片描述

线程运行任务核心代码

final void runWorker(Worker w) {Thread wt = Thread.currentThread();Runnable task = w.firstTask;w.firstTask = null;w.unlock(); // allow interruptsboolean completedAbruptly = true;try {while (task != null || (task = getTask()) != null) {w.lock();// If pool is stopping, ensure thread is interrupted;// if not, ensure thread is not interrupted.  This// requires a recheck in second case to deal with// shutdownNow race while clearing interruptif ((runStateAtLeast(ctl.get(), STOP) ||(Thread.interrupted() &&runStateAtLeast(ctl.get(), STOP))) &&!wt.isInterrupted())wt.interrupt();try {beforeExecute(wt, task);try {task.run();afterExecute(task, null);} catch (Throwable ex) {afterExecute(task, ex);throw ex;}} finally {task = null;w.completedTasks++;w.unlock();}}completedAbruptly = false;} finally {processWorkerExit(w, completedAbruptly);}
}

三、异常处理

比较全面的处理,主要是,afterExecute 方法,这个哪怕抛出异常也会执行

new ThreadPoolExecutor(IO_CORE,IO_MAX,KEEP_ALIVE_SECOND,TimeUnit.SECONDS,// 任务队列存储超过核心线程数的任务new LinkedBlockingDeque<>(QUEUE_SIZE),r -> {Thread thread = new Thread(r);thread.setDaemon(Boolean.TRUE);thread.setName(String.format("%s, message-process-thread-%d", threadName, NUM.getAndIncrement()));return thread;}
) {@Overrideprotected void afterExecute(Runnable r, Throwable t) {// 若 t 不为 null,正常处理if (Objects.nonNull(t)) {log.error(t.getMessage());}// 特别注意的是 futureTask 在 run 的时候不会立即抛异常,而是吞掉,在调用 get 的时候才能抛出// 如果是 submit 提交,原本的任务被封装成 futureTask,异常不会在 t 里,而是在 futureTask 里(但原本的任务是 futureTask 的话,则应该是原本的任务 get 的时候才会抛异常)// 如果是 execute,则 r 还是原来的任务,但不排除 r 本来就是 futureTask,那么其错误信息本来就应该通过 get 获取,在这里处理一下也无妨,不影响原本的处理结果即可// 原任务为 futureTask 的时候,get 时一定要处理异常if (r instanceof Future<?> futureTask) {try {futureTask.get();} catch (Exception e) {log.error(e.getMessage());}}}
};
log.info("线程池已经初始化");
EXECUTOR.allowCoreThreadTimeOut(Boolean.TRUE);
// JVM 关闭时的钩子函数
Runtime.getRuntime().addShutdownHook(new ShutdownHookThread("IO 密集型任务线程池", (Callable<Void>) () -> {shutdownThreadPoolGracefully(EXECUTOR);return null;})
);
http://www.dtcms.com/wzjs/242339.html

相关文章:

  • 2019年政府网站建设重点自己做的网址如何推广
  • 沧州网站优化公司百度地图排名可以优化吗
  • 网站怎么做超链接四川seo排名
  • 南京seo优化公司什么是搜索引擎优化seo
  • 美国地接公司怎么在中国网站做推广今日国际军事新闻
  • 高端网站建设加盟seo教程视频
  • 政府网站内容建设方案seo关键词优化是什么意思
  • php做的网站怎么运行深圳企业seo
  • 商城网站建设价格网络营销产品策略的内容
  • 常州做网站的网站快速排名优化价格
  • 济南php网站开发网络营销研究现状文献综述
  • 湖南网站建设 真好磐石网络网站排名查询
  • 苹果的网站怎么做的吗seo需要什么技术
  • 做外贸网站设计上需要注意什么中国百强企业榜单
  • 免费网站注册com竞价排名营销
  • wordpress wp2pcs syseo全站优化全案例
  • 权重的网站电商网络推广
  • 沧州网站建设优化河南网站推广多少钱
  • 医院网站建设考试答案百度信息流账户搭建
  • 中国风网站表现百度竞价托管哪家好
  • 手机网站模板免费模板优化网站
  • 在那里能找到网站网站制作方案
  • j永久网站推广码怎么填
  • 建手机网站款软件广告联盟接单赚钱平台
  • 网站开发drupal西安seo按天收费
  • 济南网站建设联系小七网课培训机构排名前十
  • 网站权重是什么网址大全
  • 中国文化部网站建设现状程序员培训机构哪家好
  • 代做土木毕业设计网站苏州seo关键词优化方法
  • 移动网站建设商互联网营销师是做什么的