Module  javafx.graphics
软件包  javafx.concurrent

Class Service<V>

  • 参数类型
    V - 服务返回的对象的类型
    All Implemented Interfaces:
    Worker<V>EventTarget
    已知直接子类:
    ScheduledService


    public abstract class Service<V>
    extends Object
    implements Worker<V>, EventTarget

    服务是一个非可视化组件,封装了在一个或多个后台线程上执行某些工作所需的信息。 作为JavaFX UI库的一部分,该服务了解JavaFX应用程序线程,旨在缓解应用程序开发人员处理与用户界面交互的多线程代码的负担。 因此,服务上的所有方法和状态都将专门从JavaFX应用程序线程调用。 唯一的例外是初始配置一个可以从任何线程安全地完成的服务,最初启动一个服务,这也可以从任何线程安全地完成。 但是,一旦服务已被初始化和启动,它可能只能在FX线程之后使用。

    一个服务创建并管理一个执行后台线程工作的Task 服务实施Worker 因此,您可以观察后台任务的状态,并可以取消它。 服务是一个可重用的工作者,这意味着它可以重置并重新启动。 由于这一点,服务可以声明性地构造并按需重新启动。 一旦服务启动,它将安排其任务并监听任务状态的更改。 任务不支持启动它的服务的引用,这意味着正在运行的任务不会阻止服务被垃圾回收。

    如果在服务上指定了Executor ,则将用于实际执行该服务。 否则,将创建并执行守护线程。 如果要创建非守护进程线程,请指定自定义的Executor(例如,您可以使用ThreadPoolExecutor和自定义的ThreadFactory )。

    因为一个服务旨在简化声明性用例,子类应该将工作的输入参数作为属性公开。 例如,假设我想写一个从任何URL读取第一行的服务,并将其作为String返回。 这样的服务可以被定义,使得它具有单个属性url 它可能被实现为:

       public static class FirstLineService extends Service<String> { private StringProperty url = new SimpleStringProperty(this, "url"); public final void setUrl(String value) { url.set(value); } public final String getUrl() { return url.get(); } public final StringProperty urlProperty() { return url; } protected Task createTask() { final String _url = getUrl(); return new Task<String>() { protected String call() throws Exception { URL u = new URL(_url); BufferedReader in = new BufferedReader( new InputStreamReader(u.openStream())); String result = in.readLine(); in.close(); return result; } }; } }  

    默认情况下,服务使用具有某些未指定的默认或最大线程池大小的线程池执行程序。 这样做是为了使天真的代码不会完全通过创建数千个线程来扩展系统。

    从以下版本开始:
    JavaFX 2.0
    • 构造方法详细信息

      • Service

        protected Service​()
        创建一个新的服务。
    • 方法详细信息

      • getState

        public final Worker.State getState​()
        获取属性状态的值。
        Specified by:
        getState在接口 Worker<V>
        Property description:
        结果
        这个工人的现状
      • getValue

        public final V getValue​()
        获取属性值的值。
        Specified by:
        getValue接口 Worker<V>
        Property description:
        结果
        这个工人的当前值
      • getException

        public final Throwable getException​()
        获取属性异常的值。
        Specified by:
        getException在接口 Worker<V>
        Property description:
        结果
        例外,如果发生
      • totalWorkProperty

        public final ReadOnlyDoubleProperty totalWorkProperty​()
        说明从界面Worker复制
        获取ReadOnlyDoubleProperty代表需要完成的最大工作量。 这些“工作单位”对Worker实现有意义,例如需要下载的字节数或要处理的图像数量或某种其他此类度量。
        Specified by:
        totalWorkProperty在接口 Worker<V>
        另请参见:
        getTotalWork()
      • isRunning

        public final boolean isRunning​()
        获取运行的属性的值。
        Specified by:
        isRunning在接口 Worker<V>
        Property description:
        结果
        如果此Worker正在运行,则为true
      • getMessage

        public final String getMessage​()
        获取属性消息的值。
        Specified by:
        getMessage在接口 Worker<V>
        Property description:
        结果
        当前的消息
      • getTitle

        public final String getTitle​()
        获取属性标题的值。
        Specified by:
        getTitle在接口 Worker<V>
        Property description:
        结果
        当前标题
      • setExecutor

        public final void setExecutor​(Executor value)
        设置属性执行器的值。
        Property description:
        执行者用于运行此服务。 如果没有指定执行程序,则将创建一个新的守护程序线程,并使用一些默认执行程序运行该服务。
      • getExecutor

        public final Executor getExecutor​()
        获取属性执行器的值。
        Property description:
        执行者用于运行此服务。 如果没有指定执行程序,则将创建一个新的守护程序线程,并使用一些默认执行程序运行该服务。
      • executorProperty

        public final ObjectProperty<Executor> executorProperty​()
        执行者用于运行此服务。 如果没有指定执行程序,则将创建一个新的守护程序线程,并使用一些默认执行程序运行该服务。
        另请参见:
        getExecutor()setExecutor(Executor)
      • getOnReady

        public final EventHandler<WorkerStateEvent> getOnReady​()
        每当任务状态转换到READY状态时,都会调用onReady事件处理程序。
        结果
        onReady事件处理程序(如果有)
        从以下版本开始:
        JavaFX 2.1
      • setOnReady

        public final void setOnReady​(EventHandler<WorkerStateEvent> value)
        每当任务状态转换到READY状态时,都会调用onReady事件处理程序。
        参数
        value - 事件处理程序可以为空清除它
        从以下版本开始:
        JavaFX 2.1
      • ready

        protected void ready​()
        对于子类的受保护的便利方法,在服务状态已转换到READY状态时调用。 该方法在服务完全转换到新状态后被调用。
        从以下版本开始:
        JavaFX 2.1
      • getOnScheduled

        public final EventHandler<WorkerStateEvent> getOnScheduled​()
        每当任务状态转换到SCHEDULED状态时,调用onSchedule事件处理程序。
        结果
        onScheduled事件处理程序(如果有的话)
        从以下版本开始:
        JavaFX 2.1
      • setOnScheduled

        public final void setOnScheduled​(EventHandler<WorkerStateEvent> value)
        每当任务状态转换到SCHEDULED状态时,调用onSchedule事件处理程序。
        参数
        value - 事件处理程序,可以为空清除它
        从以下版本开始:
        JavaFX 2.1
      • scheduled

        protected void scheduled​()
        每当该服务的状态已转换到SCHEDULED状态时调用的子类的受保护的便利方法。 该方法在服务完全转换到新状态后被调用。
        从以下版本开始:
        JavaFX 2.1
      • getOnRunning

        public final EventHandler<WorkerStateEvent> getOnRunning​()
        每当任务状态转换到RUNNING状态时,都会调用onRunning事件处理程序。
        结果
        onRunning事件处理程序(如果有的话)
        从以下版本开始:
        JavaFX 2.1
      • setOnRunning

        public final void setOnRunning​(EventHandler<WorkerStateEvent> value)
        每当任务状态转换到RUNNING状态时,都会调用onRunning事件处理程序。
        参数
        value - 事件处理程序,可以为空清除它
        从以下版本开始:
        JavaFX 2.1
      • running

        protected void running​()
        每当该服务的状态已经转换到RUNNING状态时,调用子类的受保护的便利方法。 该方法在服务完全转换到新状态后被调用。
        从以下版本开始:
        JavaFX 2.1
      • getOnSucceeded

        public final EventHandler<WorkerStateEvent> getOnSucceeded​()
        每当任务状态转换到SUCCEEDED状态时,调用onSucceeded事件处理程序。
        结果
        onSucceeded事件处理程序(如果有)
        从以下版本开始:
        JavaFX 2.1
      • setOnSucceeded

        public final void setOnSucceeded​(EventHandler<WorkerStateEvent> value)
        每当任务状态转换到SUCCEEDED状态时,调用onSucceeded事件处理程序。
        参数
        value - 事件处理程序,可以为空清除它
        从以下版本开始:
        JavaFX 2.1
      • succeeded

        protected void succeeded​()
        对于子类的受保护的便利方法,当服务状态已转换到SUCCEEDED状态时调用。 该方法在服务完全转换到新状态后被调用。
        从以下版本开始:
        JavaFX 2.1
      • getOnCancelled

        public final EventHandler<WorkerStateEvent> getOnCancelled​()
        每当任务状态转换到CANCELED状态时,都会调用onCancelled事件处理程序。
        结果
        onCancelled事件处理程序(如果有)
        从以下版本开始:
        JavaFX 2.1
      • setOnCancelled

        public final void setOnCancelled​(EventHandler<WorkerStateEvent> value)
        每当任务状态转换到CANCELED状态时,都会调用onCancelled事件处理程序。
        参数
        value - 事件处理程序,可以为空清除它
        从以下版本开始:
        JavaFX 2.1
      • cancelled

        protected void cancelled​()
        对于子类的受保护的便利方法,只要服务状态已经转换到CANCELED状态就调用。 该方法在服务完全转换到新状态后被调用。
        从以下版本开始:
        JavaFX 2.1
      • getOnFailed

        public final EventHandler<WorkerStateEvent> getOnFailed​()
        每当任务状态转换到FAILED状态时,都会调用onFailed事件处理程序。
        结果
        onFailed事件处理程序(如果有)
        从以下版本开始:
        JavaFX 2.1
      • setOnFailed

        public final void setOnFailed​(EventHandler<WorkerStateEvent> value)
        每当任务状态转换到FAILED状态时,都会调用onFailed事件处理程序。
        参数
        value - 事件处理程序,可以为空清除它
        从以下版本开始:
        JavaFX 2.1
      • failed

        protected void failed​()
        对于子类的受保护的便利方法,只要服务状态已经转换到FAILED状态。 该方法在服务完全转换到新状态后被调用。
        从以下版本开始:
        JavaFX 2.1
      • cancel

        public boolean cancel​()
        取消任何当前正在运行的任务(如果有)。 状态将被设置为CANCELED。
        Specified by:
        cancel在接口 Worker<V>
        结果
        如果取消成功,则返回true
      • restart

        public void restart​()
        取消任何当前正在运行的任务(如果有),并重新启动此服务。 执行前状态将重置为READY。 该方法只能在FX应用程序线程上调用。
      • reset

        public void reset​()
        重置服务。 只能在其中一个完成状态(即,已成功,失败或已取消)或READY时被调用。 该方法只能在FX应用程序线程上调用。
      • start

        public void start​()
        启动此服务。 该服务必须处于就绪状态才能在此呼叫中成功。 该方法只能在FX应用程序线程上调用。
      • executeTask

        protected void executeTask​(Task<V> task)

        使用此服务上定义的executor执行给定的任务。 如果executor为空,则使用默认执行程序,该执行程序将创建一个新的守护程序线程,以执行此任务。

        此方法仅用于由Service实现调用。

        参数
        task - 要执行的非空任务
        从以下版本开始:
        JavaFX 2.1
      • addEventHandler

        public final <T extends Event> void addEventHandler​(EventType<T> eventType,
                                                            EventHandler<? super T> eventHandler)
        注册一个事件处理程序到这个任务。 首先处理任何事件过滤器,然后处理指定的onFoo事件处理程序,最后处理通过此方法注册的任何事件处理程序。 与场景图中的其他事件一样,如果事件被消耗,则不会继续调度。
        参数类型
        T - 处理程序的特定事件类
        参数
        eventType - 处理程序接收的事件的类型
        eventHandler - 要注册的处理程序
        异常
        NullPointerException - 如果事件类型或处理程序为空
        从以下版本开始:
        JavaFX 2.1
      • removeEventHandler

        public final <T extends Event> void removeEventHandler​(EventType<T> eventType,
                                                               EventHandler<? super T> eventHandler)
        从此任务中注销先前注册的事件处理程序。 一个处理程序可能已被注册用于不同的事件类型,因此调用者需要指定特定的事件类型,从中注销处理程序。
        参数类型
        T - 处理程序的特定事件类
        参数
        eventType - 要注销的事件类型
        eventHandler - 要注销的处理程序
        异常
        NullPointerException - 如果事件类型或处理程序为空
        从以下版本开始:
        JavaFX 2.1
      • addEventFilter

        public final <T extends Event> void addEventFilter​(EventType<T> eventType,
                                                           EventHandler<? super T> eventFilter)
        将事件过滤器注册到此任务。 注册事件过滤器在任何关联的事件处理程序之前获取事件。
        参数类型
        T - 过滤器的特定事件类
        参数
        eventType - 过滤器接收的事件的类型
        eventFilter - 要注册的过滤器
        异常
        NullPointerException - 如果事件类型或过滤器为空
        从以下版本开始:
        JavaFX 2.1
      • removeEventFilter

        public final <T extends Event> void removeEventFilter​(EventType<T> eventType,
                                                              EventHandler<? super T> eventFilter)
        从此任务中注销先前注册的事件过滤器。 一个过滤器可能已被注册用于不同的事件类型,因此调用者需要指定特定的事件类型,从中注销过滤器。
        参数类型
        T - 过滤器的特定事件类
        参数
        eventType - 要注销的事件类型
        eventFilter - 要注销的过滤器
        异常
        NullPointerException - 如果事件类型或过滤器为空
        从以下版本开始:
        JavaFX 2.1
      • setEventHandler

        protected final <T extends Event> void setEventHandler​(EventType<T> eventType,
                                                               EventHandler<? super T> eventHandler)
        设置要用于此事件类型的处理程序。 一次只能有一个这样的处理程序。 这个处理程序被保证被首先调用。 这用于注册用户定义的onFoo事件处理程序。
        参数类型
        T - 处理程序的特定事件类
        参数
        eventType - 与给定eventHandler关联的事件类型
        eventHandler - 要注册的处理程序,或者取消注册为null
        异常
        NullPointerException - 如果事件类型为空
        从以下版本开始:
        JavaFX 2.1
      • fireEvent

        protected final void fireEvent​(Event event)
        触发指定的事件。 遇到的任何事件过滤器将被通知并可以使用该事件。 如果没有被过滤器使用,则会通知此任务上的事件处理程序。 如果这些也不消耗事件,那么所有事件处理程序都被调用,并且可以使用该事件。

        必须在FX用户线程上调用此方法。

        参数
        event - 事件发生
        从以下版本开始:
        JavaFX 2.1
      • buildEventDispatchChain

        public EventDispatchChain buildEventDispatchChain​(EventDispatchChain tail)
        描述从接口EventTarget复制
        为此目标构建事件调度链。 事件调度链包含可能对处理针对EventTarget的事件感兴趣的事件调度EventTarget 此事件目标不会自动添加到链中,因此如果要处理事件,则需要为链接添加一个EventDispatcher

        在事件目标是某些层次结构的一部分的情况下,它的链通常是从从层次结构的根被收集到事件目标的事件分派器构建的。

        事件调度链是通过修改提供的初始事件调度链来构建的。 返回的链应该在其末端具有初始链,所以调度员应该放在初始链上。

        调用者不应该假定初始链条保持不变,也不会返回值引用不同的链。

        Specified by:
        buildEventDispatchChain在接口 EventTarget
        参数
        tail - 从...建立的初始链
        结果
        此目标的结果事件调度链
      • createTask

        protected abstract Task<V> createTask​()
        在JavaFX应用程序主题上启动服务后调用。 实现应该在创建任务之前将任何状态保存到最终变量中,因为在任务的后台线程代码中访问服务上定义的属性将导致异常。 例如:
           protected Task createTask() { final String url = myService.getUrl(); return new Task<String>() { protected String call() { URL u = new URL("http://www.oracle.com"); BufferedReader in = new BufferedReader( new InputStreamReader(u.openStream())); String result = in.readLine(); in.close(); return result; } } }  

        如果Task是一个预定义的类(而不是匿名类),并且如果遵循推荐的最佳实践,那么在构建Task之前不需要保存状态,因为它的状态是完全提供的它的构造函数。

           protected Task createTask() { // This is safe because getUrl is called on the FX Application // Thread and the FirstLineReaderTasks stores it as an // immutable property return new FirstLineReaderTask(myService.getUrl()); }  
        结果
        执行任务