public Move getBestMoveNegascout(GameBoard board, int d) {
		ArrayList<NegascoutThread> threads = new ArrayList<NegascoutThread>();
		for (Move child : board.getAllPossibleMoves(board.currentColor)) {
			NegascoutThread t = new NegascoutThread(child, board, d);
			t.start();
			threads.add(t);
		}
		System.out.println(threads.size() + " threads started!");

		long start = System.currentTimeMillis();
		long lastPrint = start;

		while (true) {
			boolean finished = true;
			for (NegascoutThread t : threads) {
				if (!t.finished) {
					finished = false;
					break;
				}
			}
			if (!finished) {
				try {
					if (System.currentTimeMillis() - lastPrint >= SEARCH_PRINT_DELAY) {
						System.out.println("Elapsed: " + (System.currentTimeMillis() - start) / 1000. + "s. Searched "
								+ benchMark + " nodes.");
						lastPrint = System.currentTimeMillis();
					}
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			} else {
				break;
			}
		}

		Move best = null;
		int alpha = MIN;

		for (NegascoutThread t : threads) {
			if (t.alpha >= alpha) {
				alpha = t.alpha;
				best = t.best;
			}
		}

		System.out.println("Best score: " + alpha);
		cache.clear();
		return best;
	}