执行某些操作时停止应用程序

时间:2013-07-14 17:01:46

标签: java search task

我创建了一个应用程序,用于搜索目录中包含的每个文件中的单词。 我想实现一种停止搜索的方法。 我创建了一个方法,根据它在目录中找到的每种文件类型调用其他不同的方法。 我曾在一个班级工作,并创建了一个请求停止搜索的JButton

 private void jButtonActionPerformed(java.awt.event.ActionEvent evt) 
    {                                         
            System.out.println("Requesting stop");
    }   

我需要一种方法来停止搜索目录的方法,假设我的方法是search(directory);

我试图以这种方式search(directory);

private Thread a;
a = new Thread(new Runnable() { 
     @Override
     public void run() {
       search(directory);
     }
        } 
  );

然后在搜索时点击jButton停止搜索:

 private void jButtonActionPerformed(java.awt.event.ActionEvent evt) 
    {             
            System.out.println("Requesting stop");                            
            a.stop(); 
    } 

它有效,但我一直在阅读很多关于此的帖子,这不是一个停止线程的好方法。 那么还有其他选择你举个例子吗?

我也试过这个:

java.util.TimerTask timerTask;
ScheduledThreadPoolExecutor scheduledThread = new ScheduledThreadPoolExecutor(10);
timerTask = new  java.util.TimerTask() {
        @Override
        public void run() {
            search(directory);
        }
    };
scheduledThread.schedule(timerTask, 3, TimeUnit.MILLISECONDS);

然后在jButtonActionPerformed

 private void jButtonActionPerformed(java.awt.event.ActionEvent evt) 
    {                                         
       System.out.println("Requesting stop");
       scheduledThread.shutdownNow();
    } 

它也有效,但在这种情况下,当我尝试这样做时,我无法开始新的搜索。我需要关闭并重新开启申请。

1 个答案:

答案 0 :(得分:2)

一种方式:

  • 进行搜索的代码应该在自己的类中。
  • 您的GUI控制器(例如,ActionListener)将创建此类的对象。
  • 当您的GUI希望Search类进行搜索时,它应该调用该类的方法,可能是beginSearch()并在后台线程上执行此操作。
  • Search类应该有一个停止主动搜索的方法,比如GUI控制器可以调用的stopSearch()
  • 此方法可能会设置搜索对象的布尔字段 flag ,比如称为continueSearching或类似的东西,其搜索方法在搜索过程中间歇性地检查。如果布尔值设置为false,则搜索应该停止。

另请注意,你是对的。不仅建议在线程上调用stop(),而且它是非常危险的。请查看Thread API对此问题的评论:

  

已过时。这种方法本质上是不安全的。使用Thread.stop停止一个线程会导致它解锁它已锁定的所有监视器(这是未经检查的ThreadDeath异常向上传播的自然结果)。如果先前受这些监视器保护的任何对象处于不一致状态,则受损对象对其他线程可见,可能导致任意行为。 stop的许多用法应该被简单修改某个变量的代码替换,以指示目标线程应该停止运行。目标线程应该定期检查此变量,并且如果变量指示它将停止运行,则以有序的方式从其run方法返回。如果目标线程等待很长时间(例如,在条件变量上),则应使用中断方法来中断等待。

另请注意以下链接:Why is Thread.stop deprecated?


修改
你说:

  

问题是我的应用程序代码很长,很难按照你的方式编辑它......

您的课程越长,更多重要的是尝试将其分解为单独的逻辑单元。否则,你最终会得到一个调试和增强噩梦。

  

我不是编程方面的专家,而且我还在为此学习,这就是为什么我想知道根据我的情况是否有办法。

你练习重构的次数越多,你就会越好,就越容易。现在是开始的好时机。