好的,所以我试图找到2D数组的最大元素。我将有一个接受2darray作为参数并找到最大值的方法。它需要找到每行的最大元素作为一个单独的线程,以便线程并行运行,然后连接每个线程,并找到最大值以获得整个2d数组的最大值。现在我遇到的问题是run()没有返回任何值...然后我应该如何访问已修改的值。例如
public static int maxof2darray(long[][] input){
ArrayList<Thread> threads = new ArrayList<Thread>();
long[]rowArray;
for(int i=0; i<input.length; i++){
rowArray = input[i];
teste r1 = new teste(rowArray,max);
threads.add(new Thread(r1));
}
for ( Thread x : threads )
{
x.start();
}
try {
for ( Thread x : threads)
{
x.join();
}
}
你可以看到它创建了一个线程对象的arraylist。然后获取每一行并调用run()函数找到该行的最大值...问题是run()不返回任何值...那么我怎么可能访问该行的最大值?
答案 0 :(得分:3)
Future API应该做你需要的。
未来代表了一个结果 异步计算。方法是 提供检查是否计算 完成,等待它 完成,并检索结果 的计算。结果可以 只能使用方法get检索 当计算完成时, 必要时阻止直到它为止 准备。取消由。执行 取消方法。其他方法 提供是否确定任务 正常完成或被取消。 计算完成后,即可 计算无法取消。如果 你想用一个未来的 可取消性但不提供 一个可用的结果,你可以声明类型 Future的形式,返回null 作为基本任务的结果。
答案 1 :(得分:1)
我认为这不是启动和加入线程的正确方法。您应该使用线程池。
以下是演示线程池的代码示例。
ExecutorService workers = Executors.newFixedThreadPool(10);
for(int i=0; i<input.length; i++) {
Teste task = new Teste(rowArray,max);
workers.execute(task);
}
workers.shutdown();
while(!workers.isTerminated()) {
try {
Thread.sleep(10000);
} catch (InterruptedException exception) {
}
System.out.println("waiting for submitted task to finish operation");
}
希望得到这个帮助。
答案 2 :(得分:0)
除非数组相当大,否则在一个线程中进行搜索会更快。但是说大小是1000或更多我建议您使用ExecutionService这是一种管理任务的简单方法。
但是,最简单的更改是将结果存储在AtomicLong中,这样Runnables就不需要返回结果。
答案 3 :(得分:0)
您可以在包含最大行的“teste”类中添加新字段。主线程在x.join()处停止,因此在该行之后可以引用该字段并获得最大值。
.
.
.
int max=0;
for ( Thread x : threads)
{
x.join();
max=x.getMax();
}
.
.
.