0

我正在开发一个多线程项目,我希望有一个类可以在每次方法调用后延迟来自所有线程的方法调用一段时间的冷却时间。例如,给定类:

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),但问题是我希望调用线程继续执行。为了澄清,给出以下示例:

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();    
}

我希望foorunning foorunning bar立即打印(以任何顺序),然​​后是bar一秒钟后。有人知道获得这种功能的好方法吗?

编辑:

这个Printer类是我能想到的这个问题的最简单的例子,但实际上,这个类将有多种方法,都需要共享冷却时间。在此期间调用其中一种方法将延迟其他方法的执行。该类甚至可能具有共享相同冷却时间的方法的子类。

4

3 回答 3

2

您的打印机类需要;

字符串队列

一个工作线程

--

当工作线程完成冷却后,它会检查队列中的任何内容,如果没有,则停止。

当有东西添加到队列中时,如果工作线程已经停止,则再次将其启动。

于 2013-04-30T06:15:50.233 回答
0

使被调用线程使用 Thread.sleep。例如,创建一个实现 Runnable 的类。另外使该类实现冷却。Cooldown 可以有一个方法 doCooldown,它只在指定的时间内调用 Thread.sleep。如果需要,您可以在 Runnable 类中有一个变量,它是cooldownTime ......

于 2013-04-30T06:15:59.363 回答
0

你可以这样写你的冷却方法:

 private void cooldown(long ms) {
   try {
    wait(ms);
} catch (InterruptedException e) {
    e.printStackTrace();
}

此外,如果您想稍后打印bar,请更改您的方法 print(),使其首先等待然后 print():

public synchronized void print(String str) {
        cooldown(1000);
        System.out.println(str);        
    } 
于 2013-04-30T06:18:52.077 回答