延迟调用对象而不强制当前线程进入休眠状态

时间:2013-04-30 06:07:23

标签: java multithreading concurrency

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

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

我想 foo 运行foo 运行栏立即打印(按任意顺序),然​​后是 bar 一秒钟后。有没有人知道获得这种功能的好方法?

修改

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

3 个答案:

答案 0 :(得分:2)

您的打印机类需要;

字符串的队列

工作线程

-

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

当队列中添加了某些内容时,如果工作线程已停止,请再次启动它。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以像这样编写冷却方法:

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

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

public synchronized void print(String str) {
        cooldown(1000);
        System.out.println(str);        
    }