Reputation: 1012
I want to call my function on specific time interval. For now my time interval set fixed as 1 minute. I have following code example:
Timer.java
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Timer implements Runnable{
public static volatile boolean isRunning = true;
@Override
public void run() {
while (isRunning) {
if(Thread.currentThread().getName().equals("TimerThread")){
System.out.println("Start Time "+new Date());
try {
test();
Thread.sleep(60000);
} catch (InterruptedException ex) {
Logger.getLogger(Timer.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("End Time "+new Date());
}
}
}
public void test(){
System.out.println("Call Test ===========================> "+new Date());
}
}
NewJFrame.java
import java.awt.event.ItemEvent;
import java.util.Date;
public class NewJFrame extends javax.swing.JFrame {
/**
* Creates new form NewJFrame
*/
public NewJFrame() {
initComponents();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jToggleButton1 = new javax.swing.JToggleButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jToggleButton1.setText("Start");
jToggleButton1.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
jToggleButton1ItemStateChanged(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(162, 162, 162)
.addComponent(jToggleButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(138, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(129, 129, 129)
.addComponent(jToggleButton1)
.addContainerGap(142, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void jToggleButton1ItemStateChanged(java.awt.event.ItemEvent evt) {
// TODO add your handling code here:
if(evt.getStateChange() == ItemEvent.SELECTED){
jToggleButton1.setText("Stop");
timer = new Timer();
timer.isRunning = true;
timerThread = new Thread(timer);
timerThread.setName("TimerThread");
timerThread.start();
}else{
jToggleButton1.setText("Start");
timer.isRunning = false;
System.out.println("Stop Time ===============> "+new Date());
}
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
}
public Timer timer;
public Thread timerThread;
// Variables declaration - do not modify
private javax.swing.JToggleButton jToggleButton1;
// End of variables declaration
}
When I start thread then I will get following output:
Start Time Sat Aug 08 10:45:01 IST 2015
Call Test ===========================> Sat Aug 08 10:45:01 IST 2015
Once Time interval completed then I get following output:
End Time Sat Aug 08 10:46:01 IST 2015
Start Time Sat Aug 08 10:46:01 IST 2015
Call Test ===========================> Sat Aug 08 10:46:01 IST 2015
after that I have stop my thread on 00:00:30 second so I will get following output:
Stop Time ===============> Sat Aug 08 10:46:31 IST 2015
I have stop my Thread on 00:00:30 second but my function call automatically after 00:00:30 second
Any one help me that how can I call any function on fixed time interval using Thread Just like When I click on Start button then my thread will start and call function then after wait for 2 minute. After 2 minute again call my function and repeat cycle. If I click stop button then thread will stop until I will start Thread using Start button.
Upvotes: 0
Views: 778
Reputation: 41188
The correct answer is: Don't use a Thread
. Use a Timer
, SwingTimer
or ScheduledExecutorService
depending on what you want the Thread
to do.
To answer the actual question though you want then check isRunning
and exit immediately after the sleep completes. You can also send an interrupt to the thread to make the sleep stop immediately if that is something you want.
Upvotes: 2