Threads Java

/*
Java Threads, 3rd Edition
By Scott Oaks, Henry Wong
3rd Edition September 2004 
ISBN: 0-596-00782-5
*/
import java.util.concurrent.*;
import java.util.*;
import java.text.*;
import java.io.*;
public class SingleThreadTest {
  public static void main(String[] args) {
    int nTasks = 5;
    int fib = 4;
    SingleThreadAccess sta = new SingleThreadAccess();
    for (int i = 0; i < nTasks; i++)
      sta.invokeLater(new Task(fib, "Task " + i));
    sta.shutdown();
  }
}
class SingleThreadAccess {
  private ThreadPoolExecutor tpe;
  public SingleThreadAccess() {
        tpe = new ThreadPoolExecutor(
          1, 1, 50000L, TimeUnit.SECONDS,
          new LinkedBlockingQueue());
    }  public void invokeLater(Runnable r) {
    tpe.execute(r);
  }
  public void invokeAneWait(Runnable r) throws InterruptedException,
      ExecutionException {
    FutureTask task = new FutureTask(r, null);
    tpe.execute(task);
    task.get();
  }
  public void shutdown() {
    tpe.shutdown();
  }
}
class Task implements Runnable {
  long n;
  String id;
  private long fib(long n) {
    if (n == 0)
      return 0L;
    if (n == 1)
      return 1L;
    return fib(n - 1) + fib(n - 2);
  }
  public Task(long n, String id) {
    this.n = n;
    this.id = id;
  }
  public void run() {
    Date d = new Date();
    DateFormat df = new SimpleDateFormat("HH:mm:ss:SSS");
    long startTime = System.currentTimeMillis();
    d.setTime(startTime);
    System.out.println("Starting task " + id + " at " + df.format(d));
    fib(n);
    long endTime = System.currentTimeMillis();
    d.setTime(endTime);
    System.out.println("Ending task " + id + " at " + df.format(d)
        + " after " + (endTime - startTime) + " milliseconds");
  }
}