Program: 21131
Project: 21131
Buggy source:
private void startLinkCheck(){
  if (checkThread != null && checkThread.isAlive()) {
    return;
  }
  checkThread=new Thread(){
    public void run(){
      setName("String_Node_Str");
      getBroadcaster().fireEvent(new LinkCheckEvent(this,LinkCheckEvent.START));
      pc=new ProgressController("String_Node_Str");
      pc.getBroadcaster().addListener(LinkCheck.getLinkChecker());
      pc.setRange(0);
      while (LinksToCheck.size() != 0) {
        Vector<DownloadLink> currentList;
synchronized (LinksToCheck) {
          currentList=new Vector<DownloadLink>(LinksToCheck);
          pc.addToMax(currentList.size());
        }
        HashMap<String,Vector<DownloadLink>> map=new HashMap<String,Vector<DownloadLink>>();
        for (        DownloadLink dl : currentList) {
          Vector<DownloadLink> localList=map.get(dl.getPlugin().getHost());
          if (localList == null) {
            localList=new Vector<DownloadLink>();
            map.put(dl.getPlugin().getHost(),localList);
          }
          localList.add(dl);
        }
        checkJobbers=new Jobber(4);
        Vector<DownloadLink> hosterList;
        for (Iterator<Vector<DownloadLink>> it=map.values().iterator(); it.hasNext(); ) {
          hosterList=it.next();
          CheckThread cthread=new CheckThread(hosterList);
          checkJobbers.add(cthread);
        }
        int todo=checkJobbers.getJobsAdded();
        checkJobbers.start();
        while (checkJobbers.getJobsFinished() != todo) {
          try {
            Thread.sleep(200);
          }
 catch (          InterruptedException e) {
            return;
          }
        }
        checkJobbers.stop();
synchronized (LinksToCheck) {
          LinksToCheck.removeAll(currentList);
        }
      }
      try {
        Thread.sleep(2000);
      }
 catch (      InterruptedException e) {
        return;
      }
      pc.finalize();
      pc.getBroadcaster().removeListener(LinkCheck.getLinkChecker());
      getBroadcaster().fireEvent(new LinkCheckEvent(this,LinkCheckEvent.STOP));
      check_running=false;
    }
  }
;
  checkThread.start();
}

Fixed version (ground truth):
private void startLinkCheck(){
  if (checkThread != null && checkThread.isAlive()) {
    return;
  }
  checkThread=new Thread(){
    public void run(){
      setName("String_Node_Str");
      getBroadcaster().fireEvent(new LinkCheckEvent(this,LinkCheckEvent.START));
      pc=new ProgressController("String_Node_Str");
      pc.getBroadcaster().addListener(LinkCheck.getLinkChecker());
      pc.setRange(0);
      while (LinksToCheck.size() != 0) {
        Vector<DownloadLink> currentList;
synchronized (LinksToCheck) {
          currentList=new Vector<DownloadLink>(LinksToCheck);
          pc.addToMax(currentList.size());
        }
        HashMap<String,Vector<DownloadLink>> map=new HashMap<String,Vector<DownloadLink>>();
        for (        DownloadLink dl : currentList) {
          Vector<DownloadLink> localList=map.get(dl.getPlugin().getHost());
          if (localList == null) {
            localList=new Vector<DownloadLink>();
            map.put(dl.getPlugin().getHost(),localList);
          }
          localList.add(dl);
        }
        checkJobbers=new Jobber(4);
        Vector<DownloadLink> hosterList;
        for (Iterator<Vector<DownloadLink>> it=map.values().iterator(); it.hasNext(); ) {
          hosterList=it.next();
          CheckThread cthread=new CheckThread(hosterList);
          checkJobbers.add(cthread);
        }
        int todo=checkJobbers.getJobsAdded();
        checkJobbers.start();
        while (checkJobbers.getJobsFinished() != todo) {
          try {
            Thread.sleep(200);
          }
 catch (          InterruptedException e) {
            return;
          }
        }
        checkJobbers.stop();
synchronized (LinksToCheck) {
          LinksToCheck.removeAll(currentList);
        }
        try {
          Thread.sleep(2000);
        }
 catch (        InterruptedException e) {
          return;
        }
      }
      pc.finalize();
      pc.getBroadcaster().removeListener(LinkCheck.getLinkChecker());
      getBroadcaster().fireEvent(new LinkCheckEvent(this,LinkCheckEvent.STOP));
      check_running=false;
    }
  }
;
  checkThread.start();
}