我们如何将可调用转换为可运行的

时间:2016-04-21 18:24:15

标签: java multithreading runnable callable scheduledexecutorservice

我有一个实现可调用接口的类。我想使用ScheduledExecutorService接口的scheduleAtFixedRate方法为该类安排任务。但是,scheduleAtFixedRate需要一个可运行的对象作为它可以调度的命令。

因此我需要一些方法可以将callable转换为runnable。我尝试过简单的铸造但是没有用。

示例代码:

package org.study.threading.executorDemo;

import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

class ScheduledExecutionTest implements Callable<String> {

    @Override
    public String call() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("inside the call method");
        return null;
    }

}
public class ScheduledExecution {
    public static void main(String[] args) {
        ScheduledExecutorService sec = Executors.newScheduledThreadPool(10);
        sec.scheduleAtFixedRate(new ScheduledExecutionTest(), 5, 2, TimeUnit.SECONDS);
    }
}

5 个答案:

答案 0 :(得分:8)

FutureTask task1 = new FutureTask(Callable<V> callable)

现在这个task1是可运行的,因为:

  1. class FutureTask<V> implements RunnableFuture<V>
  2. RunnableFuture<V> extends Runnable, Future<V>
  3. 所以从上面两个关系来看,task1是可运行的,可以在Executor.execute(Runnable)方法中使用

答案 1 :(得分:2)

假设您并不真的需要Callable返回任何有用的内容,您可以将Callable包装为Runnable

Runnable run = new Runnable() {
    public void run() {
        try {
            Object o = callable.call();
            System.out.println("Returned " + o);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
};

或在Java 8中

Runnable run = () -> {
    try {
        Object o = callable.call();
        System.out.println("Returned " + o);
    } catch (Exception e) {
        e.printStackTrace();
    }
};

这很乱,但听起来Callable应该是Runnable,你不会这么做。

答案 2 :(得分:1)

JDK为此具有一个util方法:

Runnable runnable = ..
Executors.callable(runnable);

答案 3 :(得分:0)

为什么不使用类似的东西:

  final Callable<YourType> callable = ...; // Initialize Callable

  Runnable callableAsRunnable = () -> {
     try {
        callable.call();
     } catch (Exception e) {
        // Handle the exception locally or throw a RuntimeException
     }
  };

答案 4 :(得分:0)

使用将来的任务,它实现了Runnable和callable,你不需要更改代码。

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/FutureTask.html