gpt4 book ai didi

java - ScheduledThreadPoolExecutor实时改变任务

转载 作者:行者123 更新时间:2023-12-01 15:35:49 25 4
gpt4 key购买 nike

我使用 ScheduledThreadPoolExecutor 类来安排任务每 30 或 60 秒运行一次,如下面的代码所示。我希望能够根据 isRmi 变量的值“实时”更改要执行的任务,但我似乎无法让它工作。在我的应用程序开始时,变量是根据用户输入设置的,但即使我在程序执行期间更改它,它仍然执行相同的任务。你能帮我吗?

   public void execute() {

ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(3);

scheduler.scheduleAtFixedRate(new ServPresTimer(player), 0, 30, TimeUnit.SECONDS);

if (!isRMI) {
scheduler.scheduleAtFixedRate(new P2PTimer(player), 1, 60, TimeUnit.SECONDS);
} else {
scheduler.scheduleAtFixedRate(new RMITimer(player), 1, 60, TimeUnit.SECONDS);
}
}

最佳答案

不要调度两个不同的任务(P2P 和 RMI),而是调度一个任务(P2POrRMI),该任务根据 isRMI 变量的值执行 P2P 任务执行的任务,或者执行 P2P 任务执行的任务RMI 任务执行。您应该能够通过委托(delegate)给 RMI 或 P2P 来创建此 P2POrRMI 任务:

public class P2POrRMITimer implements Runnable {
private Runnable p2p;
private Runnable rmi;
private ObjectWhichContainsTheFlag flagContainer;

public P2POrRMITimer(Runnable p2p,
Runnable rmi,
ObjectWhichContainsTheFlag flagContainer) {
this.p2p = p2p;
this.rmi = rmi;
this.flagContainer = flagContainer;
}

@Override
public void run() {
if (flagContainer.isRmi()) {
rmi.run();
}
else {
p2p.run();
}
}
}

...

scheduler.scheduleAtFixedRate(new P2POrRMITimer(new P2PTimer(player),
new RMITimer(player),
this),
1,
60,
TimeUnit.SECONDS);

确保正确同步对 isRMI 的访问,或使其不稳定,因为它将由一个线程设置,并由另一个线程(调度程序线程)读取

关于java - ScheduledThreadPoolExecutor实时改变任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8862810/

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