多项任务洞察一项服务

Several Tasks insight one Service

我感兴趣的是有没有 运行 例如 7 Tasks insight 一项服务?

private final DataService service = new DataService();

    class DataService extends ScheduledService<Void>
    {
        @Override
        protected Task<Void> createTask()
        {
            return new Task<Void>()
            {
                @Override
                protected Void call() throws Exception
                {

                    // Several tasks


                    return null;
                }
            };
        }
    }

在我的例子中,我需要 运行 并行执行任务。

class DataService extends ScheduledService<Void>
{

    private int numTasks ;

    public DataService(int numTasks) {
        setExecutor(Executors.newCachedThreadPool(r -> {
            Thread t = new Thread(r);
            t.setDaemon(true);
            return t ;
        }));
        this.numTasks = numTasks ;
    }

    @Override
    protected Task<Void> createTask()
    {
        return new Task<Void>()
        {
            @Override
            protected Void call() throws Exception
            {

                // Several tasks
                for (int i = 0; i < numTasks ; i++) {
                    final int taskNumber = i ;
                    Runnable task = () -> {
                        // code to execute task taskNumber...
                    };
                    getExecutor().execute(task);
                }
                return null;
            }
        };
    }
}

请注意,调用方法将 return 立即(即在各个任务完成之前),此时服务将进入 "succeeded" 状态。如果你想让 call() 方法等待单个任务完成,你可以这样做:

class DataService extends ScheduledService<Void>
{
    private int numTasks ;

    private final ExecutorService exec = Executors.newCachedThreadPool(r -> {
            Thread t = new Thread(r);
            t.setDaemon(true);
            return t ;
        });

    public DataService(int numTasks) {
        setExecutor(exec);
        this.numTasks = numTasks ;
    }

    @Override
    protected Task<Void> createTask()
    {
        return new Task<Void>()
        {
            @Override
            protected Void call() throws Exception
            {

                // Several tasks
                List<Callable<Void>> tasks = new ArrayList<>();
                for (int i = 0; i < numTasks; i++) {
                    final int taskNumber = i ;
                    Callable<Void> task = () -> {
                        // code to execute task taskNumber...
                        return null ;
                    };
                    tasks.add(task);
                }

                exec.invokeAll(tasks);

                return null;
            }
        };
    }
}