public void runMultiThreaded(int threadCount) {
        this.runtime = System.currentTimeMillis();
        this.numRunningThreads = threadCount;
        final int[] ids = new int[threadCount + 1];
        List<String> slice;
        boolean slicedInputs;

        Logger.getLogger(Localization.getInstance().get("name")).info(Localization.getInstance().get("thread_multi"));
        Logger.getLogger(Localization.getInstance().get("name")).info(Localization.getInstance().get("dictionary_attack"));

        for (int i = 0; i < threadCount; i++) {
            ids[i] = (inputs.size() > targets.size()) ? (inputs.size() / threadCount) * i : (targets.size() / threadCount) * i;
        }

        slice = (inputs.size() > targets.size()) ? inputs : targets;
        slicedInputs = (inputs.size() > targets.size()) ? true : false;
        ids[ids.length - 1] = (slicedInputs) ? inputs.size() : targets.size();
        this.runtime = System.currentTimeMillis() - this.runtime;
        for (int i = 0; i < threadCount; i++) {
            new CrackerAttackThread(ids[i], ids[i + 1] - 1, slice.subList(ids[i], ids[i + 1] - 1), slicedInputs, this).start();
        }
        while (this.numRunningThreads > 0) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(this.results);
        Logger.getLogger(Localization.getInstance().get("name")).info(Localization.getInstance().get("runtime") + this.getRunTime() + ".");
    }