我正在创建一个程序,它将数据从日志文件发送到数据库。程序应该在我按下一个运行按钮时启动,并在我按下一个停止按钮时停止。到目前为止,当我按下Run按钮时,我能够使它运行,但是无法阻止它。有人能帮助我吗?
我想要停止的程序就是这个(我不认为所有这一切对于停止都很重要,但我会把整个程序都放在一起):
private void RunActionPerformed(java.awt.event.ActionEvent evt){
// Creating a Timer object and scheduling the program to run every ten minutes
if(evt.getSource() == Run) {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask(){
public void run() {
try {
// THE CODE, WITH WHAT HAS TO BE DONE
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null,ex);;
} catch (IOException ex) {
JOptionPane.showMessageDialog(null,ex);;
} catch (InstantiationException ex) {
JOptionPane.showMessageDialog(null,ex);;
} catch (IllegalAccessException ex) {
JOptionPane.showMessageDialog(null,ex);;
} catch (ClassNotFoundException ex) {
JOptionPane.showMessageDialog(null,ex);;
}
}
}, 0, 60 * 1000 * 10); //Number of minutes, until the program starts to run again
}
}
private void StopActionPerformed(java.awt.event.ActionEvent evt){
// TODO add your handling code here:
}
那么我应该怎么做才能阻止它呢?提前致谢
答案 0 :(得分:0)
与C#不同,Java在异步任务取消方面没有“走的路”。由于我还需要一个可取消的任务,我从.NET中调整了漂亮的Cancel-Token pattern:
您的任务(MyAsyncTask)必须从CancelableTask继承并覆盖抽象方法
public abstract T runCancelable(CancellationToken token) throws OperationCanceledException;
放置您的异步运行代码 - 并定期检查CancellationToken的方法 isCancellationRequested ()。如果返回true,则返回。 (你有一个干净的取消处理方式)
因此,运行可取消的任务是这样的:(ExecutorService)
CancellationTokenSource cancelSrc = new CancellationTokenSource();
CancelableTask<Object> task = new MyAsyncTask(cancelSrc.getToken());
//since CancelableTask is a Runnable, you can pass it to any ExecutorService
executor.execute(task);
现在,要取消您的任务,您可以使用CancellationTokenSource:
cancelSrc.cancel();
答案 1 :(得分:0)
不是很优雅,但很简单:使用布尔值:
public void run() {
if (go) {
//...
}
}
}
private void StopActionPerformed(java.awt.event.ActionEvent evt) {
go = false
}
在actionPerformed of start button
中添加'go = true'答案 2 :(得分:0)
如果您的程序遇到像DB操作这样的阻塞调用,那么除了杀死数据库连接以外没有其他选项可以退出程序。因此,如果启用Db操作,则“停止”按钮无法工作。
在其他情况下,最简单的方法是在stop方法上使用Thread类的“interrupt”函数来中断线程,然后在run方法中检查中断异常以正常退出。