@Override
        public final void run() { //Run to clean up any memory leaks we may cause by holding dead tasks
            if (tasks.isEmpty()) {
                return; // skip cleaning if there are no tasks
            }
            Iterator<Task> taskItr = tasks.keySet().iterator();
            while (taskItr.hasNext()) {
                Task task = taskItr.next(); //Get the task
                if (tasks.get(task).isDone()) { // Check task for completion
                    try {
                        tasks.get(task).get(); // Test for execution exceptions
                    }
                    catch (CancellationException cex) {
                        // Don't care if it was cancelled
                    }
                    catch (InterruptedException e) {
                        // The task was probably canceled so skip this
                    }
                    catch (ExecutionException eex) {
                        //This is important if an exception was caused in execution, print out the exception immediately
                        task.printError(eex.getCause()); // Call the printError message for the proper Task name rather than the wrapper's name
                    }
                    taskItr.remove();
                }
            }
        }