Reputation: 137
timer.schedule(new PressTask(), 2000, rand);
I want the above to have rand be a different number every time it excecutes. For example, the first time timer.schedule is called, let's say rand is 5345. The next time that it is called, it should be a different number, not 5345. How would I do this?
Pardon the messy coding, this was just a little practice I made for myself.
public class Keypress
{
static Timer timer = new Timer();
static JFrame frame = new JFrame();
static JButton btn = new JButton("start");
static JButton btn2 = new JButton("stop");
static JTextField txt = new JTextField();
static Robot robot;
static Random couch = new Random();
static int rand = couch.nextInt(10000 - 5000) + 5000;
public static void main(String[] args)
{
System.out.println(rand);
frame.setSize(500,300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
btn.addActionListener(new startPress());
btn2.addActionListener(new stopPress());
frame.setLayout(new GridLayout(3, 1));
frame.add(btn);
frame.add(btn2);
frame.add(txt);
try
{
robot = new Robot();
}
catch (AWTException e)
{
e.printStackTrace();
}
frame.setVisible(true);
}
static class startPress implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
timer.schedule(new PressTask(), 2000, rand);
}
}
public static class PressTask extends TimerTask
{
public void run()
{
robot.keyPress(KeyEvent.VK_1);
robot.keyRelease(KeyEvent.VK_1);
}
}
static class stopPress implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
}
}
Upvotes: 2
Views: 890
Reputation: 3161
How about a ScheduledExecutorService
instead of a Timer
?
public ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
public Random rand = new Random();
class Repeater implements Runnable{
private Runnable task;
private long interval;
private long maxInterval;
private TimeUnit unit;
public Repeater(Runnable task, long maxInterval, TimeUnit unit){
this.task = task;
this.interval = (rand.nextLong())%maxInterval //don't let interval be more than maxInterval
this.unit = unit;
this.maxInterval = maxInterval;
}
public void run(){
executor.schedule(new Repeater(task,maxInterval,unit)
, interval, unit);
}
}
class startPress implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
int maxIntervalMs = 5000;
executor.schedule( new Repeater(new PressTask(),initialIntervalMs,TimeUnit.MILLISECONDS)
, rand.nextLong()%maxIntervalMs, TimeUnit.MILLISECONDS);
}
}
Note: You can actually do the same thing with a Timer
rather than a ScheduledExecutorService
, but the wonderful book "Java Concurrency in Practice" recommends the use of ScheduledExecutorService
over Timer
for a number of reasons, including for example, better handling if an exception is thrown from the task and a more flexible api.
Upvotes: 1