在新线程上延迟方法
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()
,第一个执行程序调度就会如您所愿触发。
请注意,线程执行不一定按调用顺序发生,但通常是这样。
我有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()
,第一个执行程序调度就会如您所愿触发。
请注意,线程执行不一定按调用顺序发生,但通常是这样。