protected void schedule(boolean monitor) {
		if (monitor) {
			// call by monitor
			Iterator<Runnable> iterator = workqueue.iterator();
			int count = 0;
			while (iterator.hasNext()) {
				iterator.next();
				count++;
				if (count > 5) {
					break;
				}
			}

			if (count == 1) {
				// no work(except for schedule),simple update touch
				last_touch = System.currentTimeMillis();
				LOGGER.info("nothing to do");
				return;
			}

			if (System.currentTimeMillis() - last_touch > SCHEDULE_INTERVAL) {
				forkOrWakeupServant();
			}

			return;
		}

		long now = System.currentTimeMillis();
		long diff = now - last_touch;
		// self schedule
		if (diff > soft_delay) {
			forkOrWakeupServant();
			last_touch = System.currentTimeMillis();
			return;
		}

		last_touch = now;
		return;
	}