gpt4 book ai didi

java - 我是否以正确的方式使用可调用和 future 多线程(java)?

转载 作者:行者123 更新时间:2023-11-29 06:12:06 25 4
gpt4 key购买 nike

我需要多线程完成一些任务。
我事先知道当所有任务完成后我将继续我的计划。
以下代码是否适用于此目的?

  public void test() {
Callable<String> myCall = new Callable() {

@Override
public String call() throws Exception {
return doDomething();
}
};


Callable<String> myCall2 = new Callable() {

@Override
public String call() throws Exception {
return doDomething2();
}
};

ExecutorService executor = Executors.newFixedThreadPool(2);
List<Callable<String>> list = Arrays.asList(myCall,myCall2);
List<Future<String>> futuresList = executor.invokeAll(list);

String result1 = futuresList.get(0).get();

String result2 = futuresList.get(0).get();

//...
}

我正在尝试更改它以使用泛型:

public void test() {
Callable<?> myCall = new Callable() {

@Override
public String call() throws Exception {
return doDomething();
}
};


Callable<?> myCall2 = new Callable() {

@Override
public String call() throws Exception {
return doDomething2();
}
};

ExecutorService executor = Executors.newFixedThreadPool(2);
List<Callable<?>> list = Arrays.asList(myCall,myCall2);
List<Future<?>> futuresList = executor.invokeAll((Collection<? extends Callable<?>>)list);

String result1 = futuresList.get(0).get();

String result2 = futuresList.get(0).get();

// ...
}

我得到以下编译错误:

The method invokeAll(Collection<? extends Callable<T>>) in the type ExecutorService is not applicable for the arguments (Collection<capture#2-of ? extends Callable<?>>).

最佳答案

除了您两次访问第零索引外,我没有发现任何问题。

此编辑是关于您关于如何在没有 ExecutorService 的情况下实现它的问题。正如 ColinD 所说,你真的不应该我会说明原因

要获得相同的功能集,您需要两个对象并使用两个线程作为闩锁

String result1 = null;

String result2 = null;

public void test() {
Thread thread1 = new Thread(new Runnable(){
public void run(){
result1 = doSomething();
}
});
Thread thread2 = new Thread(new Runnable(){
public void run(){
result2 = doSomething2();
}
});
thread1.start();
thread2.start();
thread1.join();
thread2.join();
...
...

}

现在如果你想添加另一个线程/工作单元,那么你需要什么

Thread thread3 = new Thread(new Runnable(){
public void run(){
result3 = doSomething3();
}
});
thread3.start();
thread3.join();

等等。因此,您的解决方案是更好的方法。

关于java - 我是否以正确的方式使用可调用和 future 多线程(java)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6430178/

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