java - Integer 如何自动装箱到 Future何时使用可调用?
问题描述
我正在使用并发 API,并且我将其中instance
的一个传递给方法以在单个线程中执行任务。class
implements 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',我尝试分配给Integer
a Future<Integer>
,但这是一个编译器错误:
Future<Integer> x = Integer.valueOf(4); // Type mismatch: cannot convert from Integer to Future<Integer>
问题:如果方法返回一个 Integer 可以分配给 Future,我是否正确submit(Callable<T>)
?如果是这样,是否在幕后发生了一些事情来实现这一目标?
编辑:
- 将“自动装箱”更改为“已分配”
- 将注释 'Callable' 更改为 'Callable<T>'
解决方案
创建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
.
推荐阅读
- vue.js - Vue - 将 v-for 中具有相同键名的父数据传递给子组件
- spring - 春季抛出CannotCreateTransactionException
- php - 通过 Angular 6 将查询字符串中的数组发送到 PHP
- laravel - {closure}() 必须是 laravel 工厂种子上的 Faker\Generator\Generator 实例
- filereader - 浏览器控制台在 'FileReader' 上显示 readAsBinaryString':参数 1 不是 'Blob' 类型
- android - 如何使用 FusedLocationProviderClient 获取准确的位置(纬度和经度)
- java - 服务器应用程序挂起 Java socket 编程
- html - 如何去除按钮的底部空间?
- android - Ionic 3 对生产是否可靠?
- javascript - polymer-webpack-loader:如何导入和转译 Polymer .html 模板