Это немного выходит за рамки необходимого ответа, но я хотел определить, как бы я подошел к нему: иметь поточно-ориентированный приемник для ваших вызовов.Это может затем поставить в очередь сообщения с соответствующей задержкой в другом потоке:
public class MyLogger {
private final Logger logger; //some logger
private final Deque<String> out = new ArrayDeque();
private final long msgDelayMS; //how long of a time must exist between messages
public MyLogger(long msgDelayMS) {
this.msgDelayMS = msgDelayMS;
}
public void log(String simpleString) {
//Use a ReadWriteLock on `out` or somesuch to synchronize the data safely
this.out.add(simpleString);
}
public ScheduledFuture<?> start(ScheduledExecutorService executor) {
return executor.scheduleAtFixedRate(this::printNext, 0, this.msgDelayMS, TimeUnit.MILLISECONDS);
}
private void printNext() {
//again, synchronize with a `lock` field or somesuch
String next = this.out.poll();
if (next == null) {
return;
}
System.out.println(next); //prints however we like our valid queue'd item
}
}
Я не хотел бы слишком углубляться в детали многопоточности, но в этом у вас, по сути, есть потокобезопасная оболочкадля любой формы ведения журнала вы хотели бы сделать.Тогда его использование будет просто:
MyLogger logger = new MyLogger(1000L); //1000ms delay == 1 second
logger.start(Executors.newSingleThreadScheduledExecutor()); //should keep the executor somewhere
//elsewheres, from any thread, without having to keep track of time or sleep the thread
logger.log("Hello world!");
Это отделяет «выполнение» вашей регистрации и вашу реальную логику программы.Таким образом, могут регистрироваться события, которые произошли 30 секунд назад, если вы зарегистрировали 30 сообщений в определенный момент.Но это делает вашу регистрацию неблокируемой, в том смысле, что вам не нужно ждать, пока это будет подходящее время для печати, вы просто отложите ее для обработки другим потоком.Я полагаю, что этот ответ как бы соблазняет немного духа программирования, а также потому, что в любом случае я в какой-то момент играл с подобной идеей в голове.