Buggy code:
public class ProgressManager extends ProgressProvider implements IProgressService { private static final String IN_DIALOG = "inDialog" ; public static final QualifiedName PROPERTY_IN_DIALOG = new QualifiedName ( JobView . PROPERTY_PREFIX , ProgressManager . IN_DIALOG ) ; private static ProgressManager singleton ; private final Map jobs = Collections . synchronizedMap ( new HashMap ( ) ) ; private final Map familyListeners = Collections . synchronizedMap ( new HashMap ( ) ) ; final Object familyKey = new Object ( ) ; private final Collection listeners = Collections . synchronizedList ( new ArrayList ( ) ) ; final Object listenerKey = new Object ( ) ; final ErrorNotificationManager errorManager = new ErrorNotificationManager ( ) ; private final ProgressFeedbackManager feedbackManager = new ProgressFeedbackManager ( ) ; IJobChangeListener changeListener ; static final String PROGRESS_VIEW_NAME = "org.eclipse.ui.views.ProgressView" ; static final String PROGRESS_FOLDER = "icons//full//progress//" ; private static final String PROGRESS_20 = "progress20.gif" ; private static final String PROGRESS_40 = "progress40.gif" ; private static final String PROGRESS_60 = "progress60.gif" ; private static final String PROGRESS_80 = "progress80.gif" ; private static final String PROGRESS_100 = "progress100.gif" ; private static final String SLEEPING_JOB = "sleeping.gif" ; private static final String WAITING_JOB = "waiting.gif" ; private static final String BLOCKED_JOB = "lockedstate.gif" ; private static final String BUSY_OVERLAY = "progressspin.gif" ; private static final String MAXIMIZE = "maximize.gif" ; private static final String MINIMIZE = "minimize.gif" ; private static final String PROGRESS_20_KEY = "PROGRESS_20" ; private static final String PROGRESS_40_KEY = "PROGRESS_40" ; private static final String PROGRESS_60_KEY = "PROGRESS_60" ; private static final String PROGRESS_80_KEY = "PROGRESS_80" ; private static final String PROGRESS_100_KEY = "PROGRESS_100" ; public static final String SLEEPING_JOB_KEY = "SLEEPING_JOB" ; public static final String WAITING_JOB_KEY = "WAITING_JOB" ; public static final String BLOCKED_JOB_KEY = "LOCKED_JOB" ; public static final String BUSY_OVERLAY_KEY = "BUSY_OVERLAY" ; public static final String MINIMIZE_KEY = "MINIMIZE_FLOATING" ; public static final String MAXIMIZE_KEY = "MAXIMIZE_FLOATING" ; static final String [ ] keys = new String [ ] { ProgressManager . PROGRESS_20_KEY , ProgressManager . PROGRESS_40_KEY , ProgressManager . PROGRESS_60_KEY , ProgressManager . PROGRESS_80_KEY , ProgressManager . PROGRESS_100_KEY } ; final Map runnableMonitors = Collections . synchronizedMap ( new HashMap ( ) ) ; public static ProgressManager getInstance ( ) { } public static Image getProgressImageFor ( int done ) { } class JobMonitor implements IProgressMonitorWithBlocking { Job job ; String currentTaskName ; IProgressMonitorWithBlocking listener ; JobMonitor ( Job newJob ) { } void addProgressListener ( IProgressMonitorWithBlocking monitor ) { } public void beginTask ( String taskName , int totalWork ) { } public void done ( ) { JobInfo info = getJobInfo ( job ) ; info . clearTaskInfo ( ) ; info . clearChildren ( ) ; <START_BUG> runnableMonitors . remove ( this ) ; <END_BUG> if ( ( listener ) != null ) listener . done ( ) ; } public void internalWorked ( double work ) { } public boolean isCanceled ( ) { } public void setCanceled ( boolean value ) { } public void setTaskName ( String taskName ) { } public void subTask ( String name ) { } public void worked ( int work ) { } public void clearBlocked ( ) { } public void setBlocked ( IStatus reason ) { } } ProgressManager ( ) { } private void createChangeListener ( ) { } private void setUpImage ( URL iconsRoot , String fileName , String key ) throws MalformedURLException { } public IProgressMonitor createMonitor ( Job job ) { } public IProgressMonitor getDefaultMonitor ( ) { } public ProgressManager . JobMonitor progressFor ( Job job ) { } void addListener ( IJobProgressManagerListener listener ) { } void removeListener ( IJobProgressManagerListener listener ) { } JobInfo getJobInfo ( Job job ) { } public void refreshJobInfo ( JobInfo info ) { } public void refreshGroup ( GroupInfo info ) { } public void refreshAll ( ) { } public void removeJobInfo ( JobInfo info ) { } public void removeGroup ( GroupInfo group ) { } public void addJobInfo ( JobInfo info ) { } public void addGroup ( GroupInfo info ) { } boolean isNonDisplayableJob ( Job job , boolean debug ) { } private boolean isNeverDisplayedJob ( Job job ) { } public JobInfo [ ] getJobInfos ( boolean debug ) { } public JobTreeElement [ ] getRootElements ( boolean debug ) { } public boolean hasJobInfos ( ) { } private boolean hasNoRegularJobInfos ( ) { } Image getImage ( ImageData source ) { } ImageData [ ] getImageData ( URL fileSystemPath , ImageLoader loader ) { } public IStatus requestInUI ( UIJob job , String message ) { } ProgressFeedbackManager getFeedbackManager ( ) { } public void busyCursorWhile ( final IRunnableWithProgress runnable ) throws InterruptedException , InvocationTargetException { } private void scheduleProgressMonitorJob ( final ProgressMonitorJobsDialog dialog ) { } public void shutdown ( ) { } public IProgressMonitor createProgressGroup ( ) { } public IProgressMonitor createMonitor ( Job job , IProgressMonitor group , int ticks ) { } void addListenerToFamily ( Object family , IJobBusyListener listener ) { } void removeListener ( IJobBusyListener listener ) { } private Collection busyListenersForJob ( Job job ) { } public void showInDialog ( Shell shell , Job job , boolean runImmediately ) { } }

Fix:
runnableMonitors . remove ( job ) ;