Как отменить запущенное задание и заменить его новым в том же потоке? - PullRequest
4 голосов
/ 13 марта 2012

Я хотел бы отменить запущенное задание и заменить его новым в том же потоке.

В приведенном ниже коде я использовал однопоточный исполнитель , чтобы запустить новое задание и захватить 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();
            }
        });
    }
}

1 Ответ

4 голосов
/ 13 марта 2012

Простой вызов отмены для объекта 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;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...