public List<String> start(String nzbPath) {
        List<String> out = new LinkedList<String>();
        
        NZB nzb = getNzb(nzbPath);
        List<File> files = nzb.getFiles();
        int fileCount = 1;
        for (Iterator<File> i = files.iterator(); i.hasNext();) {
            File file = i.next();
            System.out.println("File " + fileCount + "/" + files.size() + " " + file.getSubject());
            List<String> segmentNames = new ArrayList<String>();
            List<DownloadThread> downloadThreads = new ArrayList<DownloadThread>();


            for (Iterator<Segment> j = file.getSegments().
                    iterator(); j.hasNext();) {
                Segment seg = j.next();
                String downloadName = file.getSubject().
                        hashCode() + "_" + seg.getNumber() + ".yenc";

                //Thread thread = createDownloadSegThread(segCount, file.getGroups().get(0).getName(), "<" + seg.getString() + ">", downloadName);
                DownloadThread thread = createDownloadSegThread(pool, file.getGroups().
                        get(0).
                        getName(), "<" + seg.getString() + ">", downloadName);
                thread.start();
                try {
                    //Give some time for the thread to get started so that the joins complete in a good order.
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                }
                downloadThreads.add(thread);

                segmentNames.add(downloadName);
            }

            //Wait for all the threads to finish
            int segCount = 1;
            boolean failure = false;
            for (Iterator<DownloadThread> t = downloadThreads.iterator(); t.hasNext();) {
                try {
                    DownloadThread thread = t.next();
                    thread.join();
                    if (thread.getResult()) {
                        System.out.println("\t" + segCount + "/" + file.getSegments().
                                size() + " of " + file.getSubject());
                    } else {
                        System.err.println("\t" + segCount + "/" + file.getSegments().
                                size() + " of " + file.getSubject() + " failed.");
                        failure = true;
                    }
                    segCount++;
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            if (!failure) {
                String filename = launchDecode(segmentNames);
                if (filename != null)
                    out.add(filename);
            } else {
                System.err.println("Couldn't download all segments.  Skipping decode.");
                for (Iterator<String> j = segmentNames.iterator(); j.hasNext();) {
                    //clean up segments
                    new java.io.File(config.getCacheDir() + java.io.File.separator + j.next()).delete();
                }
            }

            fileCount++;
        }
        return out;
    }