public List<M> solve()
        throws InterruptedException
    {
        try
        {
            P pos = puzzle.initialPosition();
            exec.execute(newTask(pos, null, null));
            Node<P, M> solnNode = solution.getValue();
            return (solnNode == null) ? null : solnNode.asMoveList();
        }
        finally
        {
            exec.shutdown();
        }
    }