我有以下代码,我试图在我的项目中允许线程。这里是我的方法,它为每个现有的PrgState(即每个线程)执行一步。
public void oneStepForAllPrg(List<PrgState> prgList){
ExecutorService executor = Executors.newFixedThreadPool(100);
prgList.forEach(prg ->controllerMethod(false,prg.toString()));
//here prepare the list of callables
List<Callable<PrgState>> callList = new ArrayList<>();
callList = prgList.stream()
.map(p ->(() -> {return p.oneStep();}))
.collect(Collectors.toList()); //receive error here
//start the execution of the callables
//it returns the list of new created threads
List<PrgState> newPrgList = //the error here if I modify
executor.invokeAll(callList).stream()
.map(future -> {try {
return future.get();
}catch (Exception e){
System.out.println("Error ctrl method oneStepForAllPrg");
}
})
.filter(p -> p!=null )
.collect(Collectors.toList());
prgList.addAll(newPrgList);
prgList.forEach(prg ->prg.toString());
public void controllerMethod(boolean flag,String s){
PrgState prg;
if (flag == false){
writeToFile(s);
}
if (flag == true){
//
}
}
如何管理错误:
cannot convert from List<Object> to List<Callable<PrgState>>?
我的意思是,他们俩都是名单,为什么不被允许?
答案 0 :(得分:2)
假设PrgState.oneStep()返回一个PrgState,请尝试更改
.map(p ->(() -> {return p.oneStep();}))
到
.map(p -> ((Callable<PrgState>)(() -> p.oneStep())))
你不能只是撒上lambda,他们只是一个匿名类的语法糖,编译器需要知道它是什么类型的
编辑:
第二个错误与第一个错误无关;你的未来 - &gt;如果有异常,lambda不会返回任何内容,而且可能无法编译。
EDIT2:
此代码将生成newPrgList:
import static java.util.concurrent.CompletableFuture.*;
...
Executor e = Executors.newFixedThreadPool (100);
List<PrgState> = prgList.stream ()
.map (p -> supplyAsync ( () -> p.oneStep (), e))
.reduce (new ArrayList<PrgState> (), (a, f) -> {
try {
a.add (f.get ());
return a;
} catch (Exception e1) {
throw new RuntimeException (e1);
}
}, (a1, a2) -> {
ArrayList<PrgState> a = new ArrayList<> ();
a.addAll (a1);
a.addAll (a2);
return a;
});
答案 1 :(得分:0)
这可能会对您有所帮助。
将块大小定义为10000。
int chunkSize = 10000;
final AtomicInteger counter = new AtomicInteger(0);
List<CallableObj> recordsList = dataList.stream().collect(Collectors.groupingBy(it -> counter.getAndIncrement() / chunkSize)).values()
.stream().map(obj -> new CallableObj(obj)).collect(Collectors.toList());
Callable对象如下:
public class CallableObj<T> implements Callable<T> {
private List<Object> recordsList;
public CallableObj(List<Object> recordsList) {
super();
this.recordsList = recordsList;
}
@Override
public T call() throws Exception{
//code....
}
}
希望这可以解决目的。
谢谢
Atul