获取计划任务的结果

Bli*_*1eg 1 java concurrency scheduling scheduled-tasks java.util.concurrent

我正在尝试学习java并发API,对于我的练习,我想安排一个作业每隔X秒定期运行一次.该作业将计算随机数.

我想在完成后立即获得计划任务的结果.我无法仅使用API​​完成此操作,因此我将其破解.

有没有办法更好地做到这一点,而不使用低级机制?我希望能够删除同步MyRandomGiverTask.getResult(),而是使用类似的东西ScheduledFuture.get().但在我的代码中,ScheduledFuture永远不会完成/完成.这是我目前的解决方案:

class A {
    public static void main() {
        MyRandomGiverTask task = new MyRandomGiverTask(200);
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        ScheduledFuture<Double> scheduledDouble =
            (ScheduledFuture<Double>) scheduler
                .scheduleAtFixedRate(task, 1, 4, TimeUnit.SECONDS);
        while (true) {
            System.out.println(" >> " + task.getResult());
        }
    }
    public class MyRandomGiverTask implements Runnable {
        MyRandomGiver giver = new MyRandomGiver();
        int param;
        double result;
        public MyRandomGiverTask(int param) { this.param = param; }
        @Override public void run() { result = giver.getRandom(param); }
        public double getResult() {
            try {
                while (result == 0d) {
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                return result;
            } finally {
                result = 0d;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 7

您的任务按固定费率安排.这意味着在您取消任务之前,执行者将以固定费率一次又一次地执行该任务.这样的任务唯一能做的就是产生副作用.它不能返回任何内容,因为执行程序返回的未来代表任务的所有待处理执行.顺便说一句,您会注意到该schedule方法采用Callable作为参数(可能会产生某些结果),而该sceduleAtFixedRate方法只接受Runnable作为参数(返回void,因此不能返回任何内容).

因此,如果要打印每次执行的结果,则只需使任务本身(Runnable)打印其结果,或让runnable将其结果放入阻塞队列,并take从队列中获取主线程.因此主线程将被阻塞,一些结果被放入队列中.