如何在Java中将可运行对象转换为可调用对象

时间:2020-01-09 10:35:12  来源:igfitidea点击:

在Java中,有两种方法可以实现一个类,该类的实例将由线程执行。

  • 通过实现Runnable接口。
  • 通过实现Callable接口。

查看这篇文章Java中Runnable和Callable之间的区别,以了解Java中Runnable和Callable之间的区别。

但是,如果我们有一个Runnable并想在运行时将其转换为Java中的Callable怎么办。 Java中的Executors类提供了实用程序方法来进行这种转换。

  • callable(Runnable task)–返回一个Callable对象,该对象在被调用时运行给定任务并返回null。
  • callable(Runnable task,T result)–返回一个Callable对象,该对象在被调用时运行给定的任务并返回给定的结果。

在Java中将Runnable转换为Callable

1使用第一个方法–可调用(可运行任务)

public class RunnableToCallable {
  public static void main(String[] args) {
    ExecutorService es = Executors.newFixedThreadPool(2);
    // converting runnable task to callable
    Callable<Object> callable = Executors.callable(new MyRunnable());
    // submit method
    Future<Object> f = es.submit(callable);
    try {
      System.out.println("Result- " + f.get());
    } catch (InterruptedException | ExecutionException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    es.shutdown();
  }
}

class MyRunnable implements Runnable{
  @Override
  public void run() {
    System.out.println("Running task..");
  }
}

输出:

Running task..
Result- null

2使用第二个方法callable(可运行任务,T结果)

public class RunnableToCallable {
  public static void main(String[] args) {
    ExecutorService es = Executors.newFixedThreadPool(2);
    // converting runnable task to callable
    Callable<String> callable = Executors.callable(new MyRunnable(), "From callable");
    // submit method
    Future<String> f = es.submit(callable);
    try {
      System.out.println("Result- " + f.get());
    } catch (InterruptedException | ExecutionException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    es.shutdown();
  }
}

class MyRunnable implements Runnable{
  @Override
  public void run() {
    System.out.println("Running task..");
  }
}

输出:

Running task..
Result- From callable