public synchronized byte[] execute() {
		POWWorker[] workers = new POWWorker[Runtime.getRuntime().availableProcessors() * THREADS_PER_CPU];

		for (int i = 0; i < workers.length; i++) {
			workers[i] = new POWWorker(target, i, workers.length, initialHash, this, targetLoad / THREADS_PER_CPU);
			new Thread(workers[i], "POW Worker No. " + i).start();
		}

		try {
			wait();
		} catch (InterruptedException e) {
			LOG.log(Level.SEVERE, "Waiting interrupted!", e);
			System.exit(1);
		}

		for (POWWorker w : workers) {
			w.stop();
		}

		return Util.getBytes(finishedWorker.getNonce());
	}