gpt4 book ai didi

java - ExcectorService中的submit(Runnable)和submit(Callable)之间的区别?

转载 作者:行者123 更新时间:2023-12-01 17:46:24 25 4
gpt4 key购买 nike

下面是实现Runnable类的代码

public class ExecutorServiceWithRunnable {

public static void main(String[] args) {
ExecutorService pool = Executors.newFixedThreadPool(10);
Future<emp> submit =null;
emp emp = new emp();
for(int i=0;i<5;i++) {
submit = (Future<emp>) pool.submit(new RunnableClass(emp));
try {
System.out.println(submit.get().getId());
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


}
}
class RunnableClass implements Runnable{

emp e=null;
public RunnableClass(emp emp) {
// TODO Auto-generated constructor stub
this.e=emp;
}

@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName()+"...."+e.getId());
e.setId(e.getId()+1);

}

}
class emp{
int id;
String status;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}

得到的结果是:pool-1-thread-1....0线程“main”中出现异常ExecutorServiceWithRunnableCallable.main 处的 java.lang.NullPointerException(ExecutorServiceWithRunnable.java:15)

下面是Callable的代码

public class ExecutorServiceWithRunnableCallable2 {

public static void main(String[] args) {
ExecutorService pool = Executors.newFixedThreadPool(10);
Future<emp> submit =null;
emp emp = new emp();
for(int i=0;i<5;i++) {
submit = pool.submit(new CallableClass(emp));
try {
System.out.println(submit.get().getId());
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


}
}
class CallableClass implements Callable<emp>{
emp e=null;
public CallableClass(emp emp) {
// TODO Auto-generated constructor stub
this.e=emp;
}

@Override
public emp call() {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName()+"...."+e.getId());
e.setId(e.getId()+1);
return e;
}

}

**得到的输出是:**pool-1-thread-1....01池-1-线程-2....12池-1-线程-3....23池-1-线程-4....34池-1-线程-5....45

请澄清我在这两种情况下提交方法返回的 future 对象。

最佳答案

一个Runnable不返回结果。所以Future::get仍然会阻塞,直到可运行完成,然后返回 null .

submit = (Future<emp>) pool.submit(new RunnableClass(emp));

这个类转换会产生一个警告,因为你实际上并没有得到 Future<emp>这里。因为你忽略了这一点,所以后来你得到了异常。

就像 Javadoc 所说,您确实得到了 Future<?> ,这意味着(在本例中)您不能使用结果值。

submit = pool.submit(new CallableClass(emp));

如果您想要结果,请提交 Callable。请注意,不需要进行类转换,它可以从 Callable 的类型推断出 Future 的通用类型。

关于java - ExcectorService中的submit(Runnable)和submit(Callable)之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54672625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com