1

我正在创建一个将数据从日志文件发送到数据库的程序。程序应该在我按下运行按钮时启动,并在我按下停止按钮时停止。到目前为止,当我按下运行按钮时,我能够让它运行,但无法停止它。有人能帮我吗?

我要停止的程序是这样的(我不认为所有这些对于停止都很重要,但我会放整个程序):

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:
}                            

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

4

3 回答 3

0

如果您的程序被阻塞调用(如 DB 操作)击中,那么除了终止 db 连接以退出程序之外别无选择。因此,如果 Db 操作打开,则停止按钮无法工作。

在其他情况下,最简单的方法是通过在 stop 方法上使用 Thread 类的“interrupt”函数来中断线程,然后在 run 方法中检查中断异常以正常退出。

于 2013-04-28T12:44:29.950 回答
0

与 C# 不同,Java 在异步任务取消方面没有“可走的路”。因为我也需要一个可取消的任务,所以我从 .NET改编了漂亮的Cancel-Token 模式:

您的任务 (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();
于 2013-04-28T12:30:36.417 回答
0

不是很优雅,但很简单:使用布尔值:

 public void run() {
   if (go) {
     //...
   }
 }
}                                   

private void StopActionPerformed(java.awt.event.ActionEvent evt) {                                     
 go = false
}           

并在开始按钮的 actionPerformed 中添加“go = true”

于 2013-04-28T12:36:57.090 回答