public void start(String hashPrefix) throws IOException, NoSuchAlgorithmException, InterruptedException {

        ArrayBlockingQueue<List<String>> in = new ArrayBlockingQueue<List<String>>(100);
        ArrayBlockingQueue<List<String>> out = new ArrayBlockingQueue<List<String>>(100);

        int threadNum = Runtime.getRuntime().availableProcessors();
        
        //setup filter threads
        FilterThread[] threads = new FilterThread[threadNum];
        for (int i = 0; i < threadNum; i++) {
            threads[i] = new FilterThread(hashPrefix, hashType, in, out);
            threads[i].start();
        }
        
        //setup output thread
        new OutputThread(out, outFile).start();
        
        //read input
        List<String> pwds = new ArrayList<String>(MAX_LIST_SIZE);
        BufferedReader reader = null;
        
        try {
            
            reader = new BufferedReader(new FileReader(inFile));

            String word = null;
            while ((word = reader.readLine()) != null) {
                
                if (pwds.size() >= MAX_LIST_SIZE) {
                    in.put(pwds);
                    pwds = new ArrayList<String>(MAX_LIST_SIZE);
                }

                pwds.add(word);

            }
            
            //final stuff
            if (!pwds.isEmpty())
                in.put(pwds);
            
        } finally {
            if (reader != null)
                reader.close();
        }
        
        
        //send kill signals
        for (int i = 0; i < threadNum; i++) //filter threads
            in.put(new ArrayList<String>());
        out.put(new ArrayList<String>()); //output thread
        
        
    }