protected void beforeRun() {
        _state = EnRunningStates.WaitingForDependencies;
        logInformation();
        _threadPool.notifyWaiting();

        boolean fulfilled = false;
        if (_fulfilledDependencies == null || _fulfilledDependencies.length != _dependencies.length) {
            _fulfilledDependencies = new boolean[_dependencies.length];
        } else {
            Arrays.fill(_fulfilledDependencies, false);
        }

        while (!fulfilled) {
            fulfilled = true;
            for (int i = 0, l = _dependencies.length; i < l; i++) {
                if (!_fulfilledDependencies[i]) {
                    _fulfilledDependencies[i] = _dependencies[i].check();
                    if (!(fulfilled &= _fulfilledDependencies[i])) {
                        continue;
                    }
                }
            }
            if (!fulfilled) {
                try {
                    synchronized (_threadPool) {
                        //To Avoid RaceConditions between Dependencies and Notfiy-Mechanism
                        _threadPool.wait(50);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        }
        _state = EnRunningStates.Running;
        logInformation();
        _threadPool.notifyWaiting();
    }