Java中的并行线程

时间:2010-12-10 08:57:24

标签: java

好的,所以我试图找到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()不返回任何值...那么我怎么可能访问该行的最大值?

4 个答案:

答案 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();
}
.
.
.