比如说我有一个方法A() { System.out.println("123");}
有三个类要调用这个方法。
要求是当第一个类执行过这个方法之后。第二个类必须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]
直接上代码:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Main {
public static void s() throws Exception
{
Thread workThread = new Thread();
workThread.start();
while(true)
{
A.aa();//这里只是一个调用的例子,具体根据实际方法来调用
workThread.sleep(120000);
B.aa();//这里只是一个调用的例子,具体根据实际方法来调用
workThread.sleep(120000);
C.aa();//这里只是一个调用的例子,具体根据实际方法来调用
workThread.sleep(120000);
}
}
public static void main(String[] args) {
try {
s();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}