uG环球色碟博彩平台玩家_一个 Callable 接口能有些许常识点?
  • 首页
  • 欧博博彩开户
  • 欧博娱乐开户
  • 欧博娱乐在线
  • 欧博百家乐
  • 欧博会员网站
  • 欧博在线登录
  • 欧博真人平台
  • 欧博体育网站
  • 欧博在线代理
  • 栏目分类
    欧博会员网站你的位置:欧博体育网址 > 欧博会员网站 > uG环球色碟博彩平台玩家_一个 Callable 接口能有些许常识点?

    uG环球色碟博彩平台玩家_一个 Callable 接口能有些许常识点?

    发布日期:2023-10-30 02:21    点击次数:75

    uG环球色碟博彩平台玩家_一个 Callable 接口能有些许常识点?

    uG环球色碟博彩平台玩家_

     澳门真人百家乐

    皇冠球盘电脑网址

    并发编程一直是才能员们比较头疼的,若何编写正确的并发才能比较其他才能来说,是一件比较贫穷的事情,并发编程中出现的 Bug 经常亦然极端诡异的。

    之是以说并发编程出现的 Bug 比较诡异,是因为在并发编程中,许多时辰出现的 Bug 不一定能齐全的复现出来,也即是说,并发编程的 Bug 是很难重现,很难跟踪的。

    今天,冰河再次带小伙伴们复盘下Callable接口,好了,插足今天的正题。

    本文纯干货,从源码角度真切剖析Callable接口,但愿各人踏下心来,翻开你的IDE,随着著述看源码,顺服你一定收货不小。

    皇冠体育hg86a

    Callable接口先容

    Callable接口是JDK1.5新增的泛型接口,在JDK1.8中,被声明为函数式接口,如下所示。

    皇冠客服飞机:@seo3687
    @FunctionalInterface public interface Callable<V> {     V call() throws Exception; } 

    在JDK 1.8中只声明有一个措施的接口为函数式接口,函数式接口不错使用@FunctionalInterface注解修饰,也不错不使用@FunctionalInterface注解修饰。只有一个接口中只包含有一个措施,那么,这个接口即是函数式接口。

    在JDK中,兑现Callable接口的子类如下图所示。

    默许的子类层级关系图看不清,这里,不错通过IDEA右键Callable接口,采取“Layout”来指定Callable接口的兑现类图的不同结构,如下所示。

    这里,不错采取“Organic Layout”选项,采取后的Callable接口的子类的结构如下图所示。

    在兑现Callable接口的子类中,有几个比较进攻的类,如下图所示。

    离别是:Executors类中的静态里面类:PrivilegedCallable、PrivilegedCallableUsingCurrentClassLoader、RunnableAdapter和Task类下的TaskCallable。

    Callable接口的兑现类

    接下来,分析的类主要有:PrivilegedCallable、PrivilegedCallableUsingCurrentClassLoader、RunnableAdapter和Task类下的TaskCallable。固然这些类在试验使命中很少被获胜用到,然而作为别称及格的开发工程师,设置是光头的资深内行来说,了解并掌合手这些类的兑现存助你进一步清爽Callable接口,并擢升专科技巧(头发再掉一批,哇哈哈哈。。。)。

    PrivilegedCallable

    PrivilegedCallable类是Callable接口的一个出奇兑现类,它标明Callable对象有某种特权来看望系统的某种资源,PrivilegedCallable类的源代码如下所示。

    /**  * A callable that runs under established access control settings  */ static final class PrivilegedCallable<T> implements Callable<T> {  private final Callable<T> task;  private final AccessControlContext acc;   PrivilegedCallable(Callable<T> task) {   this.task = task;   this.acc = AccessController.getContext();  }   public T call() throws Exception {   try {    return AccessController.doPrivileged(     new PrivilegedExceptionAction<T>() {      public T run() throws Exception {       return task.call();      }     }, acc);   } catch (PrivilegedActionException e) {    throw e.getException();   }  } } 

    从PrivilegedCallable类的源代码来看,不错将PrivilegedCallable算作是对Callable接口的封装,况且这个类也继承了Callable接口。

    在PrivilegedCallable类中有两个成员变量,离别是Callable接口的实例对象和AccessControlContext类的实例对象,如下所示。

    private final Callable<T> task; private final AccessControlContext acc; 

    其中,AccessControlContext类不错清爽为一个具有系统资源看望方案的高下文类,通过这个类不错看望系统的特定资源。通过类的构造措施不错看出,在实例化AccessControlContext类的对象时,只需要传递Callable接口子类的对象即可,如下所示。

    PrivilegedCallable(Callable<T> task) {  this.task = task;  this.acc = AccessController.getContext(); } 

    AccessControlContext类的对象是通过AccessController类的getContext()措施取得的,这里,稽察AccessController类的getContext()措施,如下所示。

    public static AccessControlContext getContext(){  AccessControlContext acc = getStackAccessControlContext();  if (acc == null) {   return new AccessControlContext(null, true);  } else {   return acc.optimize();  } } 

    通过AccessController的getContext()措施不错看出,最初通过getStackAccessControlContext()措施来取得AccessControlContext对象实例。如果取得的AccessControlContext对象实例为空,则通过调用AccessControlContext类的构造措施实例化,不然,调用AccessControlContext对象实例的optimize()措施复返AccessControlContext对象实例。

    这里,咱们先看下getStackAccessControlContext()措施是个什么鬼。

    皇冠博彩官网
    private static native AccessControlContext getStackAccessControlContext(); 

    蓝本是个土产货措施,措施的字面真谛即是取得大略看望系统栈的方案高下文对象。

    博彩游戏软件

    接下来,欧博在线登录咱们回到PrivilegedCallable类的call()措施,如下所示。

    财富
    public T call() throws Exception {  try {   return AccessController.doPrivileged(    new PrivilegedExceptionAction<T>() {     public T run() throws Exception {      return task.call();     }    }, acc);  } catch (PrivilegedActionException e) {   throw e.getException();  } } 

    通过调用AccessController.doPrivileged()措施,传递PrivilegedExceptionAction。接口对象和AccessControlContext对象,并最终复返泛型的实例对象。

    最初,看下AccessController.doPrivileged()措施,如下所示。

    博彩平台玩家一位知情人士透露,某大亨一家赌场进行高额赌博,并输掉数百万元激动地骰子砸向庄家。此举引发周围哄笑关注,人们深感博彩风险魅力。
    @CallerSensitive public static native <T> T     doPrivileged(PrivilegedExceptionAction<T> action,                  AccessControlContext context)     throws PrivilegedActionException; 

    不错看到,又是一个土产货措施。也即是说,最终的引申情况是将PrivilegedExceptionAction接口对象和AccessControlContext对象实例传递给这个土产货措施引申。况且在PrivilegedExceptionAction接口对象的run()措施中调用Callable接口的call()措施来引申最终的业务逻辑,况且复返泛型对象。

    PrivilegedCallableUsingCurrentClassLoader

    此类暗示为在一经招引的特定看望按捺和现时的类加载器下运行的Callable类,源代码如下所示。

    /**  * A callable that runs under established access control settings and  * current ClassLoader  */ static final class PrivilegedCallableUsingCurrentClassLoader<T> implements Callable<T> {  private final Callable<T> task;  private final AccessControlContext acc;  private final ClassLoader ccl;   PrivilegedCallableUsingCurrentClassLoader(Callable<T> task) {   SecurityManager sm = System.getSecurityManager();   if (sm != null) {    sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);    sm.checkPermission(new RuntimePermission("setContextClassLoader"));   }   this.task = task;   this.acc = AccessController.getContext();   this.ccl = Thread.currentThread().getContextClassLoader();  }   public T call() throws Exception {   try {    return AccessController.doPrivileged(     new PrivilegedExceptionAction<T>() {      public T run() throws Exception {       Thread t = Thread.currentThread();       ClassLoader cl = t.getContextClassLoader();       if (ccl == cl) {        return task.call();       } else {        t.setContextClassLoader(ccl);        try {         return task.call();        } finally {         t.setContextClassLoader(cl);        }       }      }     }, acc);   } catch (PrivilegedActionException e) {    throw e.getException();   }  } } 

    这个类清爽起来比较圣洁,最初,在类中界说了三个成员变量,如下所示。

    private final Callable<T> task; private final AccessControlContext acc; private final ClassLoader ccl; 

    接下来,通过构造措施注入Callable对象,在构造措施中,最初取得系统安全处罚器对象实例,通过系统安全处罚器对象实例检查是否具有取得ClassLoader和设置ContextClassLoader的权限。并在构造措施中为三个成员变量赋值,如下所示。

    PrivilegedCallableUsingCurrentClassLoader(Callable<T> task) {  SecurityManager sm = System.getSecurityManager();  if (sm != null) {   sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);   sm.checkPermission(new RuntimePermission("setContextClassLoader"));  }  this.task = task;  this.acc = AccessController.getContext();  this.ccl = Thread.currentThread().getContextClassLoader(); } 

    接下来,通过调用call()措施来引申具体的业务逻辑,如下所示。

    public T call() throws Exception {  try {   return AccessController.doPrivileged(    new PrivilegedExceptionAction<T>() {     public T run() throws Exception {      Thread t = Thread.currentThread();      ClassLoader cl = t.getContextClassLoader();      if (ccl == cl) {       return task.call();      } else {       t.setContextClassLoader(ccl);       try {        return task.call();       } finally {        t.setContextClassLoader(cl);       }      }     }    }, acc);  } catch (PrivilegedActionException e) {   throw e.getException();  } } 

    在call()措施中相似是通过调用AccessController类的土产货措施doPrivileged,传递PrivilegedExceptionAction接口的实例对象和AccessControlContext类的对象实例。

    具体引申逻辑为:在PrivilegedExceptionAction对象的run()措施中取恰现时哨程的ContextClassLoader对象,如果在构造措施中取得的ClassLoader对象与此处的ContextClassLoader对象是统一个对象(不啻对象实例疏通,而且内存地址也疏通),则获胜调用Callable对象的call()措施复返效果。不然,将PrivilegedExceptionAction对象的run()措施中确现时哨程的ContextClassLoader设置为在构造措施中取得的类加载器对象,接下来,再调用Callable对象的call()措施复返效果。最终将现时哨程的ContextClassLoader重置为之前的ContextClassLoader。

    uG环球色碟 RunnableAdapter

    RunnableAdapter类比较圣洁,给定运行的任务和效果,运行给定的任务并复返给定的效果,源代码如下所示。

    /**  * A callable that runs given task and returns given result  */ static final class RunnableAdapter<T> implements Callable<T> {  final Runnable task;  final T result;  RunnableAdapter(Runnable task, T result) {   this.task = task;   this.result = result;  }  public T call() {   task.run();   return result;  } } 
    TaskCallable

    TaskCallable类是javafx.concurrent.Task类的静态里面类,TaskCallable类主如若兑现了Callable接口况且被界说为FutureTask的类,况且在这个类中允许咱们阻止call()措施来更新task任务的情景。源代码如下所示。

    皇冠比分
    private static final class TaskCallable<V> implements Callable<V> {   private Task<V> task;  private TaskCallable() { }   @Override   public V call() throws Exception {   task.started = true;   task.runLater(() -> {    task.setState(State.SCHEDULED);    task.setState(State.RUNNING);   });   try {    final V result = task.call();    if (!task.isCancelled()) {     task.runLater(() -> {      task.updateValue(result);      task.setState(State.SUCCEEDED);     });     return result;    } else {     return null;    }   } catch (final Throwable th) {    task.runLater(() -> {     task._setException(th);     task.setState(State.FAILED);    });    if (th instanceof Exception) {     throw (Exception) th;    } else {     throw new Exception(th);    }   }  } } 

    从TaskCallable类的源代码不错看出,只界说了一个Task类型的成员变量。底下主要分析TaskCallable类的call()措施。

    当才能的引申插足到call()措施时,最初将task对象的started属性设置为true,暗示任务一经运行,况且将任务的情景轮番设置为State.SCHEDULED和State.RUNNING,轮番触发任务的更始事件和运行事件。如下所示。

    task.started = true; task.runLater(() -> {  task.setState(State.SCHEDULED);  task.setState(State.RUNNING); }); 

    接下来,在try代码块中引申Task对象的call()措施,复返泛型对象。如果任务莫得被取消,则更新任务的缓存,将调用call()措施复返的泛型对象绑定到Task对象中的ObjectProperty对象中,其中,ObjectProperty在Task类中的界说如下。

    private final ObjectProperty value = new SimpleObjectProperty<>(this, "value"); 

    接下来,将任务的情景设置为成效情景。如下所示。

    12代皇冠导航安装流程
    try {  final V result = task.call();  if (!task.isCancelled()) {   task.runLater(() -> {    task.updateValue(result);    task.setState(State.SUCCEEDED);   });   return result;  } else {   return null;  } } 

    如果才能抛出了极端或者不实,会插足catch()代码块,设置Task对象的Exception信息并将情景设置为State.FAILED,也即是将任务象征为失败。接下来,判断极端或不实的类型,如果是Exception类型的极端,则获胜强转为Exception类型的极端并抛出。不然,将极端或者不实封装为Exception对象并抛出,如下所示。

    catch (final Throwable th) {  task.runLater(() -> {   task._setException(th);   task.setState(State.FAILED);  });  if (th instanceof Exception) {   throw (Exception) th;  } else {   throw new Exception(th);  } } 

    好了,今天就到这儿吧,各人学会了吗?我是冰河,咱们下期见~~

    本文转载自微信公众号「冰河技巧」,不错通过以下二维码关心。转载本文请联系冰河技巧公众号。

     



    Powered by 欧博体育网址 @2013-2022 RSS地图

    皇冠体育导航皇冠体育皇冠现金网皇冠客服新2网址