【问题标题】:stop a thread in java after a given time - doesn't work在给定时间后停止java中的线程 - 不起作用
【发布时间】:2011-05-10 08:04:51
【问题描述】:

我有一个复杂的功能(优化),它可能会进入一个循环或者只是花费太多时间,并且允许的时间由用户设置。

因此,我试图在单独的线程中运行该函数,并在超过最大时间时停止它。我使用了类似下面的代码,但是它不起作用,所以

int timeMax = 2; //time in minutes  
Thread Thread_Object = new Thread_Class(... args...);
try {
  Thread_Object.start();
  Thread_Object.join(timeMax*60*1000);
}

我认为我没有正确使用“加入”功能,或者它没有按照我的理解进行。有什么想法吗?

谢谢!


感谢您的回答,目前我在这里找到了更好的主意*。它可以工作,但它仍然使用已弃用的功能“停止”。新代码是:

Thread Thread_Object = new Thread_Class(... args...);

try {
  int timeMax = 1;
  Thread_Object.start();
  Thread.currentThread().sleep( timeMax * 1000 );

    if ( Thread_Object.isAlive() ) {
        Thread_Object.stop();
        Thread_Object.join();
    }

}
catch (InterruptedException e) {

}

还不确定“加入”的作用,我得去看看书。

【问题讨论】:

  • 不要使用Thread.stop()。它会使共享数据处于不一致的状态。如果你不打算使用Timer,我建议你按照约翰五世所说的去做。

标签: java multithreading


【解决方案1】:

我建议你使用Timer。

【讨论】:

  • 对于任何需要此功能的问题,这可能是正确的构造。
  • @Amir - 我无法反驳!
  • 完成了,但我使用了 ScheduledExecutorService.scheduleAtFixedRate。
【解决方案2】:

join 方法将等待当前线程,直到正在加入的线程完成。以毫秒为参数传入的连接将等待一段时间,如果时间过去,通知等待线程并返回。

您可以做的是,在加入完成后中断您加入的线程。当然,这需要您的线程能够响应线程中断。

【讨论】:

  • interrupt() 仅在线程等待时有效(被wait(..) 或join(..) 阻塞)。
  • 这是假设您不编写处理中断的代码。您可以轻松检查 if(Thread.currentThread().isInterrupted()){ thread.interrupt();返回; }
  • 不完全:您需要使用interrupted() 检查标志(警告:这会清除标志),并处理InterruptedException。
  • 虽然这是真的,但您没有考虑到我之前的评论。我特别说如果他检查 Thread.currentThread().isInterrupted() 那么他可以假设线程应该被停止。同样重要的是要知道 isInterrupted() 不会影响中断状态
【解决方案3】:

Thread.join(milis) 不会杀死线程。它只是等待线程结束。

Java 线程是协作的:没有线程的协作,您无法停止或优雅地终止线程。一种方法是设置一个原子标志(布尔字段),线程正在检查并在设置后退出。

【讨论】:

    【解决方案4】:

    Java 中的看门狗定时器不是一件简单的事情,因为线程是协作的。我记得在一个项目中我们只是使用了 Thread.stop() 虽然它已被弃用,但没有优雅的解决方案。不过,我们在使用它时没有遇到任何问题。

    Java Watchdog 实现的一个很好的例子:

    http://everything2.com/user/Pyrogenic/writeups/Watchdog+timer

    【讨论】:

      【解决方案5】:
      猜你喜欢
      • 2011-09-25
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      相关资源
      最近更新 更多