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

织梦网站后台管理中级网站开发工程师 试题

织梦网站后台管理,中级网站开发工程师 试题,wordpress首页文章数量,室内设计欣赏网站文章目录 1.介绍2.使用示例3.执行过程描述4.整体的关系5.涉及到的核心源码#xff08;只提取了关键代码#xff09;5.1 Callable5.2 RunnableFuture5.3 FutureTask5.4 Thread 1.介绍 FutureTask 能够接收 Callable 类型的参数#xff0c;用来处理有返回结果的情况。 2.使用… 文章目录 1.介绍2.使用示例3.执行过程描述4.整体的关系5.涉及到的核心源码只提取了关键代码5.1 Callable5.2 RunnableFuture5.3 FutureTask5.4 Thread 1.介绍 FutureTask 能够接收 Callable 类型的参数用来处理有返回结果的情况。 2.使用示例 // 创建任务对象 FutureTaskInteger task new FutureTask(() - {log.debug(running);Thread.sleep(1000);return 200; });new Thread(task).start();// 主线程阻塞同步等待 task 执行完毕的结果 Integer value task.get();System.out.println(value value);3.执行过程描述 FutureTask 类在实例化构造时需要传入一个实现了 Callable 接口的类实现 Callable 接口需要重写 call 方法该方法需要一个返回值由于 Callable 定义时是以泛型定义返回值因此我们可以自定义返回值。FutureTask 会将传入的这个 Callable 实现类赋给自己的属性 private CallableV callable;FutureTask 间接实现了 Runnable 接口并重写了 run 方法重写的 run 方法中会调用到 属性 callable 的 call 方法并将 call 方法返回值存储到自己的属性 private Object outcome;Thread 类在实例化构造时可以传入一个 Runnable 接口的类由于 FutureTask 实现了 Runnable 接口因此我们可以直接将 FutureTask 对象作为构造器实参赋给 Thread对象的属性 private Runnable target;Thread 对象调用 start 方法最终会调用到自身就重写了的 run 方法自身重写的 run 方法中又会调用到 target 的 run 方法即 FutureTask 自身已经重写的 run 方法这时候就可以回到“第 2 点讲解”了解到 FutureTask 的 run 方法中所做的事情。FutureTask 对象的 get() 方法是去获取 callable 的 call 方法返回值即属性 outcome 的值。get 方法中会调用 awaitDone 方法awaitDone 方法中会使用 for (;;) 造成当前线程阻塞直到 call 方法执行结束可以获取到 outcome 的值并将 outcome 作为 get() 方法返回值。 4.整体的关系 Thread 和 FutureTask 类均实现了 Runnable 接口并重写了其 run 方法Thread 将 FutureTask 进行聚合赋给 private Runnable target。 5.涉及到的核心源码只提取了关键代码 5.1 Callable FunctionalInterface public interface CallableV {/*** Computes a result, or throws an exception if unable to do so.** return computed result* throws Exception if unable to compute a result*/V call() throws Exception; }5.2 RunnableFuture public interface RunnableFutureV extends Runnable, FutureV {/*** Sets this Future to the result of its computation* unless it has been cancelled.*/void run(); }5.3 FutureTask public class FutureTaskV implements RunnableFutureV {/** The underlying callable; nulled out after running */private CallableV callable;// 存储 callable 接口的 call 方法的返回值/** The result to return or exception to throw from get() */private Object outcome; // non-volatile, protected by state reads/writes/*() - {log.debug(running);Thread.sleep(1000);return 200;}这实际上是对函数式接口 callable 的 V call() 方法进行实现*/public FutureTask(CallableV callable) {if (callable null)throw new NullPointerException();this.callable callable;this.state NEW; // ensure visibility of callable} public void run() {// ...CallableV c callable;// 重写了 Runnable 函数式接口的 run 方法result c.call();// ...// 赋值set(result);// ...}protected void set(V v) {if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) {// 将 callable 的 call 方法返回值即我们自定义的 200 赋给 outcomeoutcome v;UNSAFE.putOrderedInt(this, stateOffset, NORMAL); // final statefinishCompletion();}}// 获取 callable 的 call 方法的返回结果public V get() throws InterruptedException, ExecutionException {int s state;if (s COMPLETING)// 获取到结果成功的标识实际是在 awaitDone 方法中用了死循环不断判断是否生成返回结果造成了线程阻塞s awaitDone(false, 0L);// 获取结果return report(s);}// timed-是否计时等待即是否设置等待超时false表示不设置true表示设置private int awaitDone(boolean timed, long nanos)throws InterruptedException {final long deadline timed ? System.nanoTime() nanos : 0L;WaitNode q null;boolean queued false;// 死循环for (;;) {if (Thread.interrupted()) {removeWaiter(q);throw new InterruptedException();}int s state;if (s COMPLETING) {if (q ! null)q.thread null;return s;}else if (s COMPLETING) // cannot time out yetThread.yield();else if (q null)q new WaitNode();else if (!queued)queued UNSAFE.compareAndSwapObject(this, waitersOffset,q.next waiters, q);else if (timed) {nanos deadline - System.nanoTime();if (nanos 0L) {removeWaiter(q);return state;}LockSupport.parkNanos(this, nanos);}elseLockSupport.park(this);}} }5.4 Thread public class Thread implements Runnable {/* What will be run. */private Runnable target;// 构造器将间接实现了 Runnable 接口的 FutureTask 对象传进来public Thread(Runnable target) {init(null, target, Thread- nextThreadNum(), 0);}private void init(ThreadGroup g, Runnable target, String name, long stackSize) {init(g, target, name, stackSize, null, true);}private void init(ThreadGroup g, Runnable target, String name,long stackSize, AccessControlContext acc,boolean inheritThreadLocals) {// ...// 将 FutureTask 对象赋给 Thread 对象的属性 targetthis.target target;}Overridepublic void run() {if (target ! null) {// 实际调用的 FutureTask 对象重写的 run 方法重写的 run 方法中又会调用 callable 接口的 call 方法并将 call 方法的返回值赋给 FutureTask 对象的属性 outcometarget.run();}} }
http://www.sadfv.cn/news/330320/

相关文章:

  • 哪个网站做签约设计师比较好做企业网站开发哪家好
  • 模版网站搭建四川成都最新新闻事件今天
  • 网站建设会计域名跟网站的区别吗
  • 网站开发视频会议插件中小企业名录查询官网
  • 佛山市外贸网站建设价格网站建设方案 安全
  • 二建转注辽宁建设主管部门网站无极ip
  • html用表格来做网站布局网络运营可以自学吗
  • 承装承修承试材料在哪个网站做电子商务网站建设与管理目录
  • 做平面设计都在那个网站找免费素材广州网站设计哪里好
  • 需要推销自己做网站的公司营销网站建设视频
  • 有哪些可以做h5的网站jsp做的零食小网站
  • 模板网站音响案例网站页面设计大小
  • 打开网页时网站顶部显示广告随后消失的广告怎么做随州做网站公司
  • 公司做的网站费用如何做账北京专业网站设计公司
  • 品牌网站建设营销型网站设计一个网站域名的组成
  • 大型门户网站建设哪便宜网站开发方案及报价
  • 如何免费简单建一个网站app下载官方网站
  • 简易微网站模板wordpress 权限问题
  • 芜湖做网站优化高新网站建设
  • 律所网站建设网站色调代号
  • 自己做网站微商关键词组合工具
  • 深圳宝安网站建设500元起价四川城乡与建设厅网站
  • 网站建设天津网站建设安排总结
  • 大商创官网周口搜索引擎优化
  • 青岛网站营销推广深圳宝安高端网站建设公司
  • 企业如何免费做网站网络设计思路
  • 中国做的手机系统下载网站wordpress 获取用户名
  • 二级网站建设 管理思路上海大型广告公司排名
  • 网站头部特效seo点击工具
  • 企业网站建设 英铭美妆网站建设规划