Все още съм начинаещ в 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);
}
}
Използвам този клас много за тестване, така че може да има допълнителен код (мисля, че го премахнах целия).