gpt4 book ai didi

java - 线程中的异常 "main"java.lang.ClassCastException : cannot be cast to java. util.concurrent.Callable

转载 作者:行者123 更新时间:2023-11-30 07:12:33 33 4
gpt4 key购买 nike

我有一个整数数组,我想以多线程方式计算每个整数^2的总和。我编写了该程序,当我运行它时,出现异常。程序如下:

package ir.org.acm.multithreadpower;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class Main3 {
public static volatile int[] a;
public static int i = 0;
public static Collection tasks=new ArrayList();
public static int sum=0;

static{
int length=9;
a=new int[length];
for(int k=0;k<length;k++)
a[k]=k;
}
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newFixedThreadPool(8);
new Main3().doJob(executor);
executor.invokeAll(tasks);
System.out.println(sum);


}
public void doJob(ExecutorService executor) throws Exception{

for(int m=0;m<(a.length);m++) {
tasks.add(new Runnable() {
@Override
public void run() {
a[i] = a[i] * a[i];
i++;
}
});
}

for (int k = 0; k < a.length; k++)
sum += k;

executor.shutdown();

}
}

程序抛出运行时异常:

Exception in thread "main" java.lang.ClassCastException: ir.org.acm.multithreadpower.Main3$2 cannot be cast to java.util.concurrent.Callable
at java.util.concurrent.AbstractExecutorService.invokeAll(AbstractExecutorService.java:235)
at ir.org.acm.multithreadpower.Main3.main(Main3.java:35)

我用谷歌搜索了这个问题,但无法解决这个问题感谢您的帮助。

问候,

最佳答案

您的问题在这里:

public static Collection tasks=new ArrayList();

这是一个rawtype ,这意味着编译器在使用这个时无法保证安全 Collection .

怎么样,让我们​​看看 Executor.invokeAll ,签名为:

<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)

所以你的Collection需要包含Callable<T> (其中 T 并不重要)。

现在,让我们看看您的代码:

public void doJob(ExecutorService executor) throws Exception {
for(int m=0;m<(a.length);m++) {
tasks.add(new Runnable() {
//^ here

所以您要添加 Runnable 。显然Runnable 不是 Callable .

TL;博士:

更改:

public static Collection tasks = new ArrayList();

至:

public static Collection<Callable<Void>> tasks = new ArrayList<>();

那么您将需要修复许多编译器错误。

<小时/>

当您编译此代码时,您会收到如下警告:

[WARNING] ...App.java:[17,27] unchecked method invocation: method invokeAll in interface java.util.concurrent.ExecutorService is applied to given types
required: java.util.Collection<? extends java.util.concurrent.Callable<T>>
found: java.util.Collection
[WARNING] ...App.java:[17,28] unchecked conversion
required: java.util.Collection<? extends java.util.concurrent.Callable<T>>
found: java.util.Collection

不要忽略编译器警告。

关于java - 线程中的异常 "main"java.lang.ClassCastException : cannot be cast to java. util.concurrent.Callable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38974881/

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