我正在开发一个多线程 Java 项目,在该项目中我希望有一些对象可以防止在一段时间内从任何线程调用它们的方法。理想情况下,这些方法调用不会被丢弃,而只是排队等待前一个方法的冷却完成。这是一个具有这种功能的类的简单示例:
public class A {
private synchronized void cooldown(long ms) {
long finishTime = ms + System.currentTimeMillis();
while (System.currentTimeMillis() < finishTime);
}
public synchronized void foo() {
// foo's code
cooldown(1000);
}
public synchronized void bar() {
// bar's code
cooldown(2000);
}
}
这行得通,但我希望有很多上述对象,我觉得里面的循环cooldown()
很浪费。我很想使用类似的构造Thread.sleep()
,但在这种情况下,这会产生强制调用线程睡眠并且不会阻止任何其他线程对 进行方法调用的不良影响A
。有什么建议么?
编辑:
为了澄清,给定以下实现:
public synchronized void foo() {
System.out.println("foo");
cooldown(1000);
}
public synchronized void bar() {
System.out.println("bar");
cooldown(2000);
}
public static void main(String[] args) {
final A a = new A();
new Thread(new Runnable() {
public void run() {
a.foo();
}
}).start();
System.out.println("foobar");
new Thread(new Runnable() {
public void run() {
a.bar();
}
}).start();
}
我希望foo和foobar立即打印(顺序无关紧要),然后是bar一秒钟后。如果cooldown()
只是调用Thread.currentThread().sleep(ms)
而不是当前的实现,那么foo将立即打印,然后是foobar和bar一秒钟后。