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

做再生料的网站优化关键词具体要怎么做

做再生料的网站,优化关键词具体要怎么做,福田区建设局网站,公司网站维护怎么维护在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述捕获Java线程池执行任务抛出的异常,更多Java专业知识,广州疯狂java培训…

   在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述捕获Java线程池执行任务抛出的异常,更多Java专业知识,广州疯狂java培训为你讲解;

  Java中线程执行的任务接口java.lang.Runnable 要求不抛出Checked异常,

  public interface Runnable {

  public abstract void run();

  }

  那么如果 run() 方法中抛出了RuntimeException,将会怎么处理了?

  通常java.lang.Thread对象运行设置一个默认的异常处理方法:

  java.lang.Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler)

  而这个默认的静态全局的异常捕获方法时输出堆栈。

  当然,我们可以覆盖此默认实现,只需要一个自定义的java.lang.Thread.UncaughtExceptionHandler接口实现即可。

  public interface UncaughtExceptionHandler {

  void uncaughtException(Thread t, Throwable e);

  }

  而在线程池中却比较特殊。默认情况下,线程池 java.util.concurrent.ThreadPoolExecutor 会Catch住所有异常, 当任务执行完成(java.util.concurrent.ExecutorService.submit(Callable))获取其结果 时(java.util.concurrent.Future.get())会抛出此RuntimeException。

  /**

  * Waits if necessary for the computation to complete, and then

  * retrieves its result.

  *

  * @return the computed result

  * @throws CancellationException if the computation was cancelled

  * @throws ExecutionException if the computation threw an exception

  * @throws InterruptedException if the current thread was interrupted while waiting

  */

  V get() throws InterruptedException, ExecutionException;

  其中 ExecutionException 异常即是java.lang.Runnable 或者 java.util.concurrent.Callable 抛出的异常。

  也就是说,线程池在执行任务时捕获了所有异常,并将此异常加入结果中。这样一来线程池中的所有线程都将无法捕获到抛出的异常。 从而无法通过设置线程的默认捕获方法拦截的错误异常。

  也不同通过自定义线程来完成异常的拦截。

  好在java.util.concurrent.ThreadPoolExecutor 预留了一个方法,运行在任务执行完毕进行扩展(当然也预留一个protected方法beforeExecute(Thread t, Runnable r)):

  protected void afterExecute(Runnable r, Throwable t) { }

  此方法的默认实现为空,这样我们就可以通过继承或者覆盖ThreadPoolExecutor 来达到自定义的错误处理。

  解决办法如下:

  ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(11, 100, 1, TimeUnit.MINUTES, //

  new ArrayBlockingQueue(10000),//

  new DefaultThreadFactory()) {

  protected void afterExecute(Runnable r, Throwable t) {

  super.afterExecute(r, t);

  printException(r, t);

  }

  };

  private static void printException(Runnable r, Throwable t) {

  if (t == null && r instanceof Future) {

  try {

  Future future = (Future) r;

  if (future.isDone())

  future.get();

  } catch (CancellationException ce) {

  t = ce;

  } catch (ExecutionException ee) {

  t = ee.getCause();

  } catch (InterruptedException ie) {

  Thread.currentThread().interrupt(); // ignore/reset

  }

  }

  if (t != null)

  log.error(t.getMessage(), t);

  }

  此办法的关键在于,事实上 afterExecute 并不会总是抛出异常 Throwable t,通过查看源码得知,异常是封装在此时的Future对象中的, 而此Future对象其实是一个java.util.concurrent.FutureTask的实现,默认的run方法其实调用的 java.util.concurrent.FutureTask.Sync.innerRun()。

  void innerRun() {

  if (!compareAndSetState(0, RUNNING))

  return;

  try {

  runner = Thread.currentThread();

  if (getState() == RUNNING) // recheck after setting thread

  innerSet(callable.call());

  else

  releaseShared(0); // cancel

  } catch (Throwable ex) {

  innerSetException(ex);

  }

  }

  void innerSetException(Throwable t) {

  for (;;) {

  int s = getState();

  if (s == RAN)

  return;

  if (s == CANCELLED) {

  // aggressively release to set runner to null,

  // in case we are racing with a cancel request

  // that will try to interrupt runner

  releaseShared(0);

  return;

  }

  if (compareAndSetState(s, RAN)) {

  exception = t;

  result = null;

  releaseShared(0);

  done();

  return;

  }

  }

  }

  这里我们可以看到它吃掉了异常,将异常存储在java.util.concurrent.FutureTask.Sync的exception字段中:

  /** The exception to throw from get() */

  private Throwable exception;

  当我们获取异步执行的结果时, java.util.concurrent.FutureTask.get()

  public V get() throws InterruptedException, ExecutionException {

  return sync.innerGet();

  }

  java.util.concurrent.FutureTask.Sync.innerGet()

  V innerGet() throws InterruptedException, ExecutionException {

  acquireSharedInterruptibly(0);

  if (getState() == CANCELLED)

  throw new CancellationException();

  if (exception != null)

  throw new ExecutionException(exception);

  return result;

  }

  异常就会被包装成ExecutionException异常抛出。

  也就是说当我们想线程池 ThreadPoolExecutor(java.util.concurrent.ExecutorService)提交任务时, 如果不理会任务结果(Feture.get()),那么此异常将被线程池吃掉。

  Future submit(Callable task);

  Future submit(Runnable task);

  而java.util.concurrent.ScheduledThreadPoolExecutor是继承ThreadPoolExecutor的,因此情况类似。

  结论,通过覆盖ThreadPoolExecutor.afterExecute 方法,我们才能捕获到任务的异常(RuntimeException)。

  疯狂Java培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。没有工作经验的学员,在疯狂java,通过大量全真经典企业级项目进行集中培训,课上讲师讲解和课下项目练习课上课下双管齐下,学员通过数月培训都可获得1-2年的工作经验,进而在同类的求职者中脱颖而出。疯狂Java培训让你体会java编程的快乐,项目开发的兴奋,激情,通过短短几个月的时间,让你在半年的时间内掌握8-10万的代码量,掌握Java核心技术,迅速成为技能型的现代化高端人才,迅速获得高薪就业!

 

转载于:https://www.cnblogs.com/gojava/p/3252449.html

http://www.lbrq.cn/news/2567611.html

相关文章:

  • 简单网页的设计过程seo服务商排名
  • 广东网站建设公司报价表互联网+营销策略怎么写
  • 农家院做宣传应该在哪个网站西地那非片的功效与作用
  • 审计局网站建设管理快照关键词优化
  • 小说网站采集可以做嘛百度热搜的含义
  • 贵州网站建设seo优化培训学校招生方案范文
  • 做最便宜的网站建设优化手机性能的软件
  • 中国建设银行网站无法访问win10一键优化工具
  • 谷歌推广seo论述搜索引擎优化的具体措施
  • 自己给网站做logo太原网络推广价格
  • 平面设计免费模板网站朋友圈营销
  • 丰台专业网站建设公司企业网站制作要求
  • 游戏网站建设一条龙数字营销课程
  • 旅社网站怎么建立如何做好一个品牌推广
  • 自己怎么做网站购买空间东莞企业网站排名优化
  • 网站轮播图教程优化营商环境的意义
  • 网站点击赚钱怎么做跨国网站浏览器
  • 免费个人logo设计seo 最新
  • 怎么自己做网站qq域名购买哪个网站好
  • 成都网站营销seo电话快排seo软件
  • 极速在线网站免费个人网站怎么建立
  • 网站平台建设合作协议友情链接官网
  • 阿里巴巴外贸批发网seo教程自学
  • 没技术怎么做网站百度竞价排名商业模式
  • 烟台网站制作公司百度做广告怎么收费
  • 网页游戏网站排名前10名长沙做网站的公司有哪些
  • 饰品公司网站建设策划书网站关键词排名优化软件
  • 没有网站可以做cpa广告么潍坊今日头条新闻最新
  • 微网站建设资讯百度推广方式
  • 东莞做棋牌网站建设网站的seo如何优化
  • sc-atac的基础知识(0)
  • SQL语言学习(group by,having)
  • java实现运行SQL脚本完成数据迁移
  • [硬件电路-120]:模拟电路 - 信号处理电路 - 在信息系统众多不同的场景,“高速”的含义是不尽相同的。
  • C语言字符函数和字符串函数全解析:从使用到模拟实现
  • 波士顿咨询校招面试轮次及应对策略解析