public List<Cluster> computeGraphClusters(Map<String, ArrayList<String>> adjList, int numbOfClusters) throws InterruptedException, ExecutionException {		
		List<Cluster> allClusters = new ArrayList<>();
		NUMB_PARALL_CLUSTERS = numbOfClusters;
		boolean seedSelected = false;
		Integer clusterId = 1;
		// a set of all protein ids that could be seeds		
		Set<String> seeds = new HashSet<>();
		for (String seed : adjList.keySet()) {
			seeds.add(seed);
		}
		do { // grow a cluster from the seed, while there is one
			Set<String> seedsToProcess = Collections
					.synchronizedSet(new HashSet<String>());
			for (int i = 0; i < NUMB_PARALL_CLUSTERS; i++) {
				String seed = selectSeed(adjList, seeds, seedsToProcess);
				/**
				 * It is enough to know if the last seed was null or not, or if
				 * any seed was null. We assume that if new seeds are not
				 * available we will start getting consecutive nulls.
				 */
				if (seed == null) {
					seedSelected = false;
				} else {
					seedsToProcess.add(seed);
					seedSelected = true;
				}
			}
			CountDownLatch doneSignal = new CountDownLatch(seedsToProcess.size());
			CountDownLatch startSignal = new CountDownLatch(1);
			List<Future<Cluster>> results = new ArrayList<Future<Cluster>>();
			for (String seed : seedsToProcess) {
				if (seed != null) {
					Seed seedC = new Seed();
					seedC.seed = seed;
					seedC.clusterId = clusterId;					
					ComputeCluster clusterComputeT = new ComputeCluster(seedC,
							adjList, doneSignal, seedsToProcess, startSignal);
					Future<Cluster> res = tPool.submit(clusterComputeT);
					results.add(res);
					clusterId++;

				}
			}
			startSignal.countDown(); // start all threads
			doneSignal.await();
			for (Future<Cluster> future : results) {
				Cluster currCluster = future.get();
				// keep only nodes not in any cluster
				seeds.removeAll(currCluster.getAllMembers());
				allClusters.add(currCluster);
			}
		} while (seedSelected);
		shutdownAndAwaitTermination(tPool);
		System.out.println("All cluster sizes: " + allClusters.size());
		return allClusters;
	}