public void run() {
			long interval = context.getTaskTrackerExpireInterval();
			while (true) {
				try {
					Thread.sleep(interval / 2);

					//
					// Loop through all expired items in the queue
					//
					// Need to lock the JobTracker here since we are
					// manipulating it's data-structures via
					// ExpireTrackers.run -> JobTracker.lostTaskTracker ->
					// JobInProgress.failedTask ->
					// JobTracker.markCompleteTaskAttempt
					// Also need to lock JobTracker before locking 'taskTracker'
					// 'trackerExpiryQueue' to prevent deadlock:

					synchronized (JobTracker.this) {
						synchronized (taskTrackerToTaskTrackerStatusMap) {
							long now = System.currentTimeMillis();
							for (TaskTrackerStatus lastStatus : taskTrackerToTaskTrackerStatusMap.values()) {
								if (now - lastStatus.getLastHeartbeatTime() > interval) {
									lostTaskTracker(lastStatus);
								}
							}
						}

					}
				} catch (InterruptedException e) {
					Log.write("ExpireTaskTracker thread interrupted");
					break;
				} catch (Exception e) {
					e.printStackTrace();
					Log.warn("ExpireTaskTracker error");
					break;
				}
			}
		}