gpt4 book ai didi

java - 如何在同一线程上取消正在运行的任务并将其替换为新任务?

转载 作者:搜寻专家 更新时间:2023-11-01 02:51:52 26 4
gpt4 key购买 nike

我想取消一个正在运行的任务,并在同一个线程上用一个新任务替换它。

在下面的代码中,我使用了一个单线程执行器来启动一个新任务并捕获一个代表它的Future。然后我使用 Future 取消任务。但是,任务并没有取消。

  1. 为什么我的代码不起作用?
  2. 如何在同一线程上取消正在运行的任务并将其替换为新任务?

示例代码:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

class Task implements Runnable {
public void run() {
System.out.println("New task started");
int i = 0; while (true) i++;
}
}

public class TaskLauncher extends JFrame {
private JButton button = new JButton("Start new task");
private ExecutorService executor = Executors.newSingleThreadExecutor();
private Future<?> future;

public TaskLauncher() {
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
if (future != null) future.cancel(true);
future = executor.submit(new Task());
}
});

add(button);

pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new TaskLauncher();
}
});
}
}

最佳答案

仅在 Future 对象上调用取消不会导致任务停止。有关详细信息,请参阅 API 文档。还要检查这个 SO Question它显示了您必须如何对任务进行编码,以便可以使用 Future 对象将其取消。

像这样修改你的任务:

class Task implements Runnable {
public void run() {
System.out.println("New task started");
int i = 0;
while (true) {
i++;
if (Thread.currentThread().isInterrupted()) {
System.out.println("Exiting gracefully");
return;
}
}
}
}

关于java - 如何在同一线程上取消正在运行的任务并将其替换为新任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9684927/

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