@Override
 public GeneList compute() throws Exception {
   final OperationPool op = OperationPool.getInstance();
   final Collection<Callable<ListView<Gene>>> threadList =
       new ArrayList<Callable<ListView<Gene>>>();
   for (int i = 0; i < geneList.size(); i++) {
     final ListView<Gene> currentGeneList = geneList.get(i);
     Callable<ListView<Gene>> currentThread =
         new Callable<ListView<Gene>>() {
           @Override
           public ListView<Gene> call() throws Exception {
             if (currentGeneList == null) {
               return null;
             }
             ListViewBuilder<Gene> resultLVBuilder = new GeneListViewBuilder();
             for (int j = 0; (j < currentGeneList.size()) && !stopped; j++) {
               Gene currentGene = currentGeneList.get(j);
               Gene geneToAdd = createGeneCopyWithConstantScore(currentGene);
               resultLVBuilder.addElementToBuild(geneToAdd);
             }
             // tell the operation pool that a chromosome is done
             op.notifyDone();
             return resultLVBuilder.getListView();
           }
         };
     threadList.add(currentThread);
   }
   List<ListView<Gene>> result = op.startPool(threadList);
   if (result == null) {
     return null;
   } else {
     return new SimpleGeneList(result, geneList.getGeneScoreType(), geneList.getGeneDBURL());
   }
 }