在新线程上延迟方法

Delay a method on a new thread

我有2个方法methodA,methodB。他们 运行 在不同的线程上。我希望 methodB 在 methodA 启动后延迟 100 毫秒 运行,我该怎么做?

代码

final ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(3);
executor.schedule(() -> highs(), 100, TimeUnit.MILLISECONDS);
new Thread(() -> highs()).start();
new Thread(() -> deleteRecords()).start();

我注意到鄙视这个,methodB总是在methodA之前运行s。

通过让 ThreadPool 立即执行一个线程,然后在 100 毫秒后安排一个线程,您将能够获得您正在寻找的效果(有 1 个线程 运行 methodA 然后另一个线程 运行 methodB 100 毫秒后)。我写了一个小例子来测试这个:

public class Main {

    public static void main (String[] args) {
        ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(3);
        executor.execute(() -> methodA());
        executor.schedule(() -> methodB(), 100, TimeUnit.MILLISECONDS);
    }

    public static void methodA(){
        System.out.println("A: " + System.currentTimeMillis());
    }

    public static void methodB(){
        System.out.println("B: " + System.currentTimeMillis());
    }
}

此程序产生此输出:

A: 1575782281388
B: 1575782281492

如果想在线程间同步处理,可以使用wait()/notify(), but if you're not sure about the order in which those "processings" will take place, I suggest you use a Semaphore代替:

Semaphore sem = new Semaphore(0); // Initialize an empty Semaphore
new Thread(() -> { // This is thread A processing, that should run first
    methodA(); // Run processing
    sem.release(); // Indicate processing is finished
}).start();

new Thread(() -> { // This is thread B processing, that should run after methodA() has completed
    sem.acquire(); // Blocks until release() is called by thread A
    methodB(); // Run processing
}).start();

原回答:

您写道:

executor.schedule(() -> highs(), 100, TimeUnit.MILLISECONDS);

100 毫秒后 highs() 将开始。

new Thread(() -> highs()).start();

另一个 highs() 开始 现在

new Thread(() -> deleteRecords()).start();

deleteRecords() 马上开始

所以 highs() 将是 运行 两次:一次是 new Thread(() -> highs()).start(),然后是 executor.schedule()

只需注释掉 new Thread(() -> highs()).start(),第一个执行程序调度就会如您所愿触发。

请注意,线程执行不一定按调用顺序发生,但通常是这样。