首页 > 解决方案 > Integer 如何自动装箱到 Future何时使用可调用?

问题描述

我正在使用并发 API,并且我将其中instance的一个传递给方法以在单个线程中执行任务。classimplements Callable<T>submit(Callable<T>)

import java.util.concurrent.*;

class myCallableClass implements Callable<Integer> { // Implementation of the Callable<T> interface
    @Override
    public Integer call() throws Exception { // Clearly returning an Integer here, and yet ...
        System.out.println("1: doing first task");
        Thread.sleep(11 * 1000);
        return WaitingForAllTasksToFinish.counter + 2;
    }
}

public class WaitingForAllTasksToFinish {
    static int counter = 2;

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService service = null;
        try {
            service = Executors.newSingleThreadExecutor();
            Future<Integer> result 
            = service.submit(new myCallableClass()); // ... it can be assigned to Future<Integer> here!
            System.out.println(result.get()); // and I can use .get() which is a Future<T> method!
        } finally {
            if (service != null) service.shutdown();
        }
    }

}

为了确定是否有'autobox',我尝试分配给Integera Future<Integer>,但这是一个编译器错误:

Future<Integer> x = Integer.valueOf(4); // Type mismatch: cannot convert from Integer to Future<Integer>

问题:如果方法返回一个 Integer 可以分配给 Future,我是否正确submit(Callable<T>)?如果是这样,是否在幕后发生了一些事情来实现这一目标?

编辑:

标签: javaconcurrency

解决方案


创建Future不是自动装箱。Java 语言并不像Future了解Integer/那样“了解” int。自动装箱特别是语言(编译器)在适当的时候自动转换int为。Integer

这里发生的是 API(在这种情况下ExecutorService.submit)将Future<T>在传入 a 时返回 a Callable<T>。ExecutorService 将安排任务执行并向您返回一个句柄 (the Future),您可以使用该句柄查询任务是否已完成,并在必要时从中获取结果。

请注意,您的代码发生了一个自动装箱实例,但这就是

return WaitingForAllTasksToFinish.counter + 2;

由于该方法被定义为返回 anInteger但表达式WaitingForAllTasksToFinish.counter + 2的类型为int,Java 会自动为您将 转换int为 an Integer,但这与创建Future.


推荐阅读