Hallo,
ich habe ein Problem beim Einsammeln der Rückgabewerte bei Callables, wen ich invokeall aufrufe.
Das untenstehende Programm ist eine Vereinfachung und funktioniert ohne Laufzeitfehler. Im Originalprogramm erscheint eine Fehlermeldung in Zeile 29. Die Fehlermeldung ist von der Form:
[WR]
java.util.concurrent.ExecutionException: java.lang.ArrayIndexOutOfBoundsException: 1
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
at java.util.concurrent.FutureTask.get(FutureTask.java:83)
at X.test(X.java:29)
....
[/WR]
Die ArrayIndexOutOfBoundsException variiert von Lauf zu Lauf, sie kann sogar die Anzahl der Tasks um das mehrfache übersteigen.
Auch wenn ich Zeile 29 durch den Code
ersetze erhalte ich eine ähnliche Fehlermeldung und zwar in
. Es wird allerdings statt der ArrayIndexOutOfBoundsException eine NullPointerException gemeldet.
Im Originalprogramm werden als Task NP-harte Probleme approximativ gelöst.
Ich habe keinen Plan was da schief läuft. Weiß da jemand weiter?
Danke und beste Grüße
samosa
ich habe ein Problem beim Einsammeln der Rückgabewerte bei Callables, wen ich invokeall aufrufe.
Das untenstehende Programm ist eine Vereinfachung und funktioniert ohne Laufzeitfehler. Im Originalprogramm erscheint eine Fehlermeldung in Zeile 29. Die Fehlermeldung ist von der Form:
[WR]
java.util.concurrent.ExecutionException: java.lang.ArrayIndexOutOfBoundsException: 1
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
at java.util.concurrent.FutureTask.get(FutureTask.java:83)
at X.test(X.java:29)
....
[/WR]
Die ArrayIndexOutOfBoundsException variiert von Lauf zu Lauf, sie kann sogar die Anzahl der Tasks um das mehrfache übersteigen.
Auch wenn ich Zeile 29 durch den Code
Code:
Future<Double> r = result.get(i);
r.get();
ersetze erhalte ich eine ähnliche Fehlermeldung und zwar in
Code:
r.get()
Im Originalprogramm werden als Task NP-harte Probleme approximativ gelöst.
Ich habe keinen Plan was da schief läuft. Weiß da jemand weiter?
Danke und beste Grüße
samosa
Java:
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class X
{
void test(int nTasks)
{
double[] x = new double[nTasks];
Collection<Task> tasks = new ArrayList<Task>();
for(int i = 0; i < nTasks; i++)
{
tasks.add(new Task(i%2 == 0? (i+1)*10 : (i+1)*50));
}
ExecutorService executor = Executors.newFixedThreadPool(2);
try
{
List<Future<Double>> result;
result = (ArrayList<Future<Double>>) executor.invokeAll(tasks);
for(int i = 0; i < nTasks; i++)
{
x[i] = result.get(i).get();
System.out.println(i + " " + x[i]);
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
executor.shutdown();
}
}
public static void main(String[] args)
{
X x = new X();
x.test(5);
}
class Task implements Callable<Double>
{
int n;
Task(int n)
{
this.n = n;
}
public Double call() throws Exception
{
double x = 0;
for(int i = 0; i < 100*n; i++)
{
for(int j = 0; j < 100*n; j++)
{
x += Math.exp(-i-j)/(100.0*n);
}
}
return new Double(x);
}
}
}