Witam
Spotkałem się takim kodem implementującym technikę aktywnych obiektów.
Czy ktoś byłby tak miły i powiedział mi jaki jest w tym sens i do czego to może służyć?
W kodzie widać, że executorem jest pojedynczy wątek. A dlaczego nie kilka? Z jednym wątkiem to kolejne wywołania metod wykonują się sekwencyjnie, dlaczego nie użyć kilku wątków. Tutaj jedynie wątek wywołujący może się czymś innym zająć.
import java.util.concurrent.*;
import java.util.*;
public class ActiveObjectDemo {
private ExecutorService ex =
Executors.newSingleThreadExecutor();
private Random rand = new Random(47);
// Losowe opóźnienie, dające efekt
// prowadzenia długotrwałych obliczeń:
private void pause(int factor) {
try {
TimeUnit.MILLISECONDS.sleep(
100 + rand.nextInt(factor));
} catch(InterruptedException e) {
System.out.println("Przerwanie zadania w sleep()");
}
}
public Future<Integer>
calculateInt(final int x, final int y) {
return ex.submit(new Callable<Integer>() {
public Integer call() {
System.out.println("zaczynam " + x + " + " + y);
pause(500);
return x + y;
}
});
}
public Future<Float>
calculateFloat(final float x, final float y) {
return ex.submit(new Callable<Float>() {
public Float call() {
System.out.println("zaczynam " + x + " + " + y);
pause(2000);
return x + y;
}
});
}
public void shutdown() { ex.shutdown(); }
public static void main(String[] args) {
ActiveObjectDemo d1 = new ActiveObjectDemo();
// Blokada wyjątku ConcurrentModificationException:
List<Future<?>> results =
new CopyOnWriteArrayList<Future<?>>();
for(float f = 0.0f; f < 1.0f; f += 0.2f)
results.add(d1.calculateFloat(f, f));
for(int i = 0; i < 5; i++)
results.add(d1.calculateInt(i, i));
System.out.println("Wykonano wszystkie wywołania asynchroniczne");
while(results.size() > 0) {
for(Future<?> f : results)
if(f.isDone()) {
try {
System.out.println(f.get());
} catch(Exception e) {
throw new RuntimeException(e);
}
results.remove(f);
}
}
d1.shutdown();
}
}