@Override public Boolean call() { try { int D = nno.numDimensions(); byte [][] points = new byte[stopRow-startRow][D]; ds.getData(startRow, stopRow, points); int [] argmins = new int[points.length]; float [] mins = new float[points.length]; nno.searchNN(points, argmins, mins); synchronized(centroids_accum){ for (int i=0; i < points.length; ++i) { int k = argmins[i]; for (int d=0; d < D; ++d) { centroids_accum[k][d] += points[i][d]; } counts[k] += 1; } } } catch(Exception e) { e.printStackTrace(); } return true; } }