Я хотел бы отменить запущенное задание и заменить его новым в том же потоке.
В приведенном ниже коде я использовал однопоточный исполнитель , чтобы запустить новое задание и захватить Future
, представляющий его. Затем я использовал Future
, чтобы отменить задачу. Однако задача не была отменена.
- Почему мой код не работает?
- Как отменить запущенное задание и заменить его новым в том же потоке?
Пример кода:
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();
}
});
}
}