linked 2011-12-09 10:54
浏览 242
已采纳

判断执行方法

比如说我有一个方法A() { System.out.println("123");}
有三个类要调用这个方法。
要求是当第一个类执行过这个方法之后。第二个类必须2分钟之后才能执行这个方法,第三个类必须等第二个类执行结束后2分钟再执行这个方法。然后第一个类在第三个类执行2分钟后再次执行这个方法,依次循环
这该如何实现呢。

  • 写回答

2条回答 默认 最新

  • 关注

    你描述的场景也不是非常明确, 大概这样吧
    [code="java"]
    import java.util.Date;

    public class DelayLock {
    private final Object lockObj = new Object(); // 锁对象

    private final long DELAY; // 间隔毫秒
    private volatile long lastCompleteTime = -1; // 上次任务结束的时间
    
    private volatile boolean running = false; // 当前是否有任务在执行
    
    public DelayLock(int DELAY) {
        this.DELAY = DELAY;
    }
    
    public void lock() throws InterruptedException {
        synchronized (lockObj) {
            while(true) {
                if(running) {
                    lockObj.wait();
                } else if(System.currentTimeMillis() - DELAY < lastCompleteTime) {
                    lockObj.wait(DELAY);
                } else {
                    break;
                }
            }
            running = true;
        }
    }
    
    public void unlock() {
        synchronized (lockObj) {
            running = false;
            lastCompleteTime = System.currentTimeMillis();
            lockObj.notifyAll();
        }
    }
    
    public static class TestClass implements Runnable {
        private final DelayLock lock;
        private int index;
        public TestClass(DelayLock lock, int index) {
            this.lock = lock;
            this.index = index;
        }
        public void testMethod() throws InterruptedException {
            lock.lock();
            try {
                System.out.println("Thread: " + index + ": begin. at: " + new Date());
                Thread.sleep(1000);
                System.out.println("Thread: " + index + ": job done! at: " + new Date());
            } finally {
                lock.unlock();
            }
        }
        public void run() {
            try {
                testMethod();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }
    
    public static void main(String[] args) {
        DelayLock lock = new DelayLock(5 * 1000); // 5秒钟
    
        for(int i = 0; i < 5; ++i) {
            TestClass t = new TestClass(lock, i);
            new Thread(t).start();
        }
    }
    

    }

    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示