如何使用停止按钮停止执行?

时间:2013-04-28 12:14:55

标签: java multithreading swing

我正在创建一个程序,它将数据从日志文件发送到数据库。程序应该在我按下一个运行按钮时启动,并在我按下一个停止按钮时停止。到目前为止,当我按下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:
}                            

那么我应该怎么做才能阻止它呢?提前致谢

3 个答案:

答案 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方法中检查中断异常以正常退出。