gpt4 book ai didi

java - 我如何并行运行两个调度程序?

转载 作者:行者123 更新时间:2023-12-01 09:48:39 25 4
gpt4 key购买 nike

我长期以来一直希望将调度程序添加到我的 API 中。所以我特意开设了一个类(class)。在这里。

public abstract class SyncScheduler extends Scheduler {

private Thread thread = null;
private boolean repeating = false;

@Override
public synchronized void runTask() {
thread = new Thread(this);
thread.start();
}

@Override
public synchronized void runTaskLater(long delay) {
thread = new Thread(this);
try {
Thread.sleep(delay * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.run();
}

@Override
public synchronized void runRepeatingTask(long period) {
thread = new Thread(this);
repeating = true;
while (!thread.isInterrupted()) {
thread.run();
try {
Thread.sleep(period * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

@Override
public synchronized void cancel() {
if (thread != null || !repeating) {
throw new SchedulerException("Scheduler is not started or is not a repeating task!");
} else {
thread.interrupt();
repeating = false;
}
}}

调度程序只是实现了Runnable。问题是,每当我尝试创建 2 个或更多调度程序时,第二个调度程序永远不会启动,直到第一个调度程序完成!例如,如果我有一个每隔 X 秒运行一次的调度程序,而另一个调度程序取消了它,则取消第一个调度程序的调度程序永远不会启动!这就是问题所在。

我如何并行运行其中两个调度程序?

这也是我的两个测试主要类(class)。

public class Test {

static Scheduler scheduler = new SyncScheduler() {

@Override
public void run() {
System.out.println("It works.");

}
};

public static void main(String[] args) {
scheduler.runRepeatingTask(1);
new SyncScheduler() {
@Override
public void run() {
System.out.println("Stopped.");
scheduler.cancel();
}
}.runTaskLater(2);

}}

这是第二个。

public class Test {

static Scheduler scheduler = new SyncScheduler() {

@Override
public void run() {
System.out.println("It works.");
new SyncScheduler() {
@Override
public void run() {
System.out.println("Stopped.");
scheduler.cancel();
}
}.runTaskLater(2);
}
};

public static void main(String[] args) {
scheduler.runRepeatingTask(1);
}}

第一个输出“It Works”。反复直到我强行停止测试。第二个给了我“它有效”。一次,然后它给我“停止”。也有异常(exception)。

最佳答案

您错误地使用了线程对象。要在不同的线程中启动 Runnable 对象(在本例中为 Thread 对象),该对象必须调用 start() 方法。您正在使用 run() 方法,该方法仅在同一线程中调用该方法,而不创建新线程。

尝试更改 SyncScheduler.runRepeatingTaskSyncScheduler.runTaskLater 中的 run()

此外,我刚刚在您的 cancel() 方法中注意到:

if (thread != null || !repeating) {
throw new SchedulerException("Scheduler is not started or is not a repeating task!");
} else {
thread.interrupt();
repeating = false;
}

如果线程启动,这将使该方法抛出异常。我认为应该是 if (thread == null || !repeating) {

关于java - 我如何并行运行两个调度程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37779924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com