Java 提交时,类实现可调用和类不';t、 执行人服务
我不熟悉这个话题。我需要异步地将任务提交给executor服务,还需要获取响应。我尝试过下面的例子 案例1:Java 提交时,类实现可调用和类不';t、 执行人服务,java,multithreading,threadpool,executorservice,callable,Java,Multithreading,Threadpool,Executorservice,Callable,我不熟悉这个话题。我需要异步地将任务提交给executor服务,还需要获取响应。我尝试过下面的例子 案例1: public class Task implements Callable<Integer> { Integer i; public Task(Integer i){ this.i = i; } @Override public Integer call(){ doTask(); } pu
public class Task implements Callable<Integer> {
Integer i;
public Task(Integer i){
this.i = i;
}
@Override
public Integer call(){
doTask();
}
public Integer doTask(){
syso(i);
return i;
}
}
public class ExecuteTask(){
public void static main (String [] args){
ExecutorService service = Executor.newCachedTheadPool();
for(int i = 0; int <10; i++) {
service.sumbit(new Task(i).doTask());
}
}
}
Output: 0,1,2,3,4,7,9,5,8,6 (expected)
公共类任务实现可调用{
整数i;
公共任务(整数i){
这个。i=i;
}
@凌驾
公共整数调用(){
doTask();
}
公共整数doTask(){
syso(i);
返回i;
}
}
公共类ExecuteTask(){
公共void静态main(字符串[]args){
ExecutorService=Executor.newCachedHeadPool();
对于(int i=0;int,如果我正确理解了您的问题:您可以使用lambda或方法引用,而这些引用不必显式实现Callable。只需遵循相同的约定:返回某些内容(而不是像Runnable那样为void)并能够引发异常。
(不过,这只适用于Java 8+)我没有传递其他要提交的内容,我已经在for循环中明确声明了可调用匿名类。我的代码将编译,并且我已经提到,只有在不将I声明为全局变量的情况下,才会出现此错误。确定。第一个代码段:任务实现可调用,但不重写call()。因此无法编译。使用Executor.newCachedHeadPool(),它不存在。第二个代码段:调用不存在的方法syso。第三个代码段:使用名为int
的未定义变量。不可能编译。尝试使用匿名类中的非最终变量。无法编译。请尝试获取问题的上下文并尝试回答我的问题。我没有复制粘贴的实际代码here(所以它只是int而不是object)…并使用syso作为System.out.println的捷径。是的,我同意我没有首先覆盖调用。我现在已经添加了。你不能访问实例变量I
form static methodmain
。我必须是静态的。Re,“我没有复制粘贴我的实际代码,”好吧,你来这里是因为你的代码有些地方你不明白。那么你怎么能确定你没有遗漏重要的部分呢?最好的问题包含一个其他人可以编译和运行的代码示例,这与你期望它做的不同。我想提交通过使用匿名内部类(如我在案例2中所写)来调用executorservice的任务。但是我看到,通过这样做,我得到的输出与实现可调用的任务不同。我这样问是因为如果不建议通过案例2提交任务,那么我将强制任务类的实现者执行我告诉你,你可能根本不需要一个匿名类:Executors.newCachedThreadPool().submit(SomeClass::doesNotImplementCallable);只要它返回一些东西并可以抛出异常,就可以很好地工作。谢谢你。你会选择这个并接受它作为答案。
public class Task {
Integer i;
public Task(Integer i){
this.i = i;
}
public Integer doTask(){
syso(i);
return i;
}
}
public class ExecuteTask(){
int i;
public void static main (String [] args){
ExecutorService service = Executor.newCachedTheadPool();
for(i = 0; int <10; i++) {
service.sumbit(new Callable<Integer>(){
@Override
public Integer call() {
Integer int = new Task(i).doTask();
return int;
}
});
}
}
}
Output: 1,3,3,6,6,6,10,10,10,10 (not expected)