Я все еще новичок в Java, поэтому я мало что узнал о потоках и параллелизме. Однако я хотел бы иметь возможность использовать ScheduledThreadPoolExecutor в качестве таймера из-за проблем, с которыми я сталкиваюсь с java.util.Timer и TimerTask. Я чрезвычайно заинтересован в создании тем и знаю, что узнаю о них через несколько недель. Однако, если возможно, может ли кто-нибудь дать мне простой пример того, как преобразовать мою текущую мини-тестовую программу с использованием util.timer в использование ScheduledThreadPoolExecutor?
Я хотел бы завершить этот пример как можно скорее, поэтому у меня не так много времени на изучение потоков — как бы мне этого ни хотелось. Сказав это, пожалуйста, включите все, что вы считаете важным, что новичок Java должен знать в отношении ScheduledThreadPoolExecutor.
Пример программы
Я сделал небольшой пример, чтобы представить проблему, с которой я сталкиваюсь в более крупной программе. Что должна делать эта программа, так это позволять пользователю нажимать кнопку для запуска счетчика. Затем пользователь должен иметь возможность останавливать и перезапускать счетчик, когда захочет. В более крупной программе жизненно важно, чтобы этот счетчик оставался равным, поэтому я использовал метод scheduleAtFixRate(). Также важно, чтобы начальная задержка всегда была одинаковой (в данном случае 0). Проблема (как я уверен, вы увидите) заключается в том, что после отмены таймера его нельзя перезапустить — я надеюсь, что ScheduledThreadPoolExecutor решит эту проблему.
код:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.TimerTask;
import java.util.Timer;
public class Tester extends JFrame {
JButton push = new JButton("Push");
static JTextArea textOut = new JTextArea();
Timer timer = new Timer();
boolean pushed = false;
static int i = 1;
public Tester() {
super();
add(push, BorderLayout.NORTH);
add(textOut);
push.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (!pushed) {
timer.scheduleAtFixedRate(new Task(), 0, 1000);
pushed = true;
} else {
timer.cancel();
pushed = false;
}
}
});
}
static class Task extends TimerTask {
public void run() {
textOut.setText("" + i++);
}
}
public static void main(String[] args) {
Tester a = new Tester();
a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
a.pack();
a.setVisible(true);
}
}
Я часто использую этот класс для тестирования, поэтому может быть лишний код (думаю, я удалил его весь).