Я работаю над многопоточным проектом, для которого я хотел бы иметь класс, который задерживает вызовы методов из всех потоков за некоторый период восстановления после каждого вызова метода. Например, если класс:Задержка вызовов объекту без принудительного отключения текущего потока
public class Printer {
protected void cooldown(long ms) {
// ???
}
public synchronized void print(String str) {
System.out.println(str);
cooldown(1000);
}
}
Я хотел бы три звонка в print()
печатать три значения каждый второй части. Хотя это можно сделать довольно легко с Thread.currentThread().sleep(ms)
, catch заключается в том, что я бы хотел, чтобы вызывающий поток продолжал его выполнение. Для уточнения, учитывая следующий пример:
public static void main(String[] args) {
final Printer p = new Printer();
new Thread(new Runnable() {
public void run() {
p.print("foo");
System.out.println("running foo");
}
}).start();
new Thread(new Runnable() {
public void run() {
p.print("bar");
System.out.println("running bar");
}
}).start();
}
Я хотел Foo, работает Foo и работает бар немедленно напечатать (в любом порядке), а затем бар второй позже. Кто-нибудь знает о хорошем подходе к таким функциям?
EDIT:
Printer
класс является самым простым примером этого вопроса, что я мог думать, но на самом деле, этот класс будет иметь целый ряд методов, которые все требуют общего времени восстановления. Вызов одного из этих методов задерживает выполнение других за это время. Класс может даже иметь подклассы с методами, которые используют этот же кулдаун.
Выглядит как вид таймера с обработкой событий. В большинстве настольных графических интерфейсов реализованы такие вещи. Может быть, вы можете получить вдохновение оттуда. – SpaceTrucker