import java.util.ArrayList; public class FibThread extends Thread { private int max; private boolean stillGoing; private ArrayList observers; public FibThread(int value) { max = value; stillGoing = false; observers = new ArrayList(); } public void addFibListener(FibListener observer) { observers.add(observer); } public void run() { stillGoing = true; for (int i = 0; stillGoing && i <= max; ++i) { int f = computeFib(i); if (stillGoing) { for (FibListener observer: observers) { observer.nextFibTerm(f); } } } stillGoing = false; for (FibListener observer: observers) { observer.finished(); } } public void endComputation() {stillGoing = false;} public boolean isFinished() {return !stillGoing;} private int computeFib(int f) { if (stillGoing) { if (f < 2) {return 1;} else { return computeFib(f - 1) + computeFib(f - 2); } } else { return 0; } } }