2016-08-25 60 views
2

在非JavaFX应用程序中,我希望具有与Task类似的Class。非Javafx等效任务

线程执行某些内容并能够返回其进度。

有什么可以执行一个类似于上面提到的任务吗?

+0

看看[FutureTask(https://开头的文档。 oracle.com/javase/7/docs/api/java/util/concurrent/FutureTask.html#get())和[Executor](https://docs.oracle.com/javase/7/docs/api/java /util/concurrent/Executor.html) – jhamon

+0

FutureTask支持无进度更新 – Hesk

+0

您能澄清“非JavaFX应用程序”吗? – jhamon

回答

2

Task类添加到FutureTask一堆功能,但所有的非明显的部位是与提供观察到性能,并确保它们被更新的FX应用程序线程做。这听起来像你不需要任何困难的部分:你正在查询任务来检查它的进度(所以你不需要可观察性,即当进度改变时调用回调)并且你没有FX应用程序线程在其上安排更新。

因此,举例来说,如果你想跟踪进展情况,只是相应的属性添加到您的Callable实现。如果你想进步是从多个线程访问,使用原子引用内部表示进度(或者至少使其volatile):

import java.util.concurrent.Callable ; 
import java.util.concurrent.atomic.AtomicLong ; 

public class MyCountingTask implements Callable<Void> { 

    private AtomicLong progressCount = new AtomicLong(); 
    private final long max = 1000 ; 

    @Override 
    public Void call() throws InterruptedException { 

     for (int count = 0; count < max ; count++) { 

      progressCount.set(count); 

      // in real life, do actual work instead of sleeping... 
      Thread.sleep(100); 
     } 

     progressCount.set(max); 

     return null ; 
    } 

    public double getProgress() { 
     return 1.0*progressCount.get()/max ; 
    } 
}