【问题标题】:Stop application while doing some operations在执行某些操作时停止应用程序
【发布时间】:2013-07-14 17:01:46
【问题描述】:

我创建了一个应用程序,它在目录中包含的每个文件中搜索一个单词。 我想实现一种停止搜索的方法。 我创建了一个方法,该方法根据在目录中找到的每个文件类型调用其他不同的方法。 我曾在一堂课上工作,我创建了一个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();
    } 

它也可以,但在这种情况下,当我尝试这样做时,我无法开始新的搜索。我需要关闭并重新打开应用程序。

【问题讨论】:

  • 标题中不需要添加major标签。

标签: java search task


【解决方案1】:

一种方式:

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

还请注意,您是正确的。在线程上调用stop() 不仅不推荐,而且非常危险。请查看Thread API 对此主题的看法:

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

还请查看此链接:Why is Thread.stop deprecated?


编辑
你说:

问题是我的应用程序代码很长,很难像你那样编辑它,...

您的课程越长,尝试将其分解为单独的逻辑单元就越重要。否则,您将面临调试和增强的噩梦。

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

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

【讨论】:

  • 好的,谢谢,但是如果我不能为搜索方法创建一个自己的类怎么办?
  • @Frank:我不明白——是什么阻止你为此创建自己的课程?我想你可以将布尔标志作为你的 GUI 的一个字段,但这有一种不好的代码气味,一种 god-class 类型的气味。
  • 问题是我的应用程序代码很长,很难像你那样编辑它,我不是编程专家,我还在为此学习,这就是我想要的原因根据我的情况知道有没有办法,不过没关系,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多