public static Collection<SineCallable> init(int numThreads, int upperBound) {
        if (upperBound < 0) {
            throw new IllegalArgumentException("Upper bound (N) cannot be negative");
        }
        
        if (numThreads < 1) {
            throw new IllegalArgumentException("Cannot configure " + numThreads
                    + " threads");
        }
        
        List<SineCallable> callables = new ArrayList<>(numThreads);
        int start = -upperBound;
        
        step = numThreads;
        
        for (int i = 0; i < numThreads; ++i) {
            SineCallable callable = new SineCallable();
            callable.startValue = start;
            callable.endValue = upperBound;
            callables.add(callable);
            ++start;
        }
        
        return callables;
    }