2014-12-06 160 views
2

我的问题的一般情况是,我们如何检测一个特定的函数调用是否花了太长时间,以致于我们想要终止它?如何限制线程的执行时间并在运行时间过长时终止它?

在我的头顶,我认为使用一个线程来运行该功能,并杀死线程,如果它运行太长的定义如下:

class MyThread extends Thread 
{ 
    public void run() 
    { 
    someFunction(); 
    } 
} 

并说someFunction可能是:

public void someFunction() 
{ 
    // Unknown code that could take arbitrarily long time. 
} 

在上面的代码中,someFunction()可能没有时间完成,或者需要花费很长时间,所以说我想在耗时过长时停止它。

然而,在Java线程的实现,显然我不能使用共享变量或时间戳的线程中,这样的线程将有时间观念,因为someFunction()玩意儿原子和这样的检查对时间戳码只能在someFunction之后去,因此在编码被执行的时候变得没用,一些功能已经完成了。

请注意,我也想这样做,someFunction()是不可知的。也就是说,someFunction()不应该 担心它运行多少时间。它根本不应该意识到它。

任何人都可以提供一些见解我如何完成此功能?

+0

你说的是死锁吗?我不指望人们像上面那样编码。给我们确切的场景。 – SMA 2014-12-06 07:04:06

+0

@almasshaikh没有关于锁。我只是问,如果我想确保一条线不会运行太久,否则我们会杀死它,我们应该怎么做? – OneZero 2014-12-06 07:05:11

+0

使用另一个计划的线程,该线程在您的线程以线程引用启动后运行,并在一小时后唤醒,如果它仍然运行中断它(只要您的线程响应中断)。 – SMA 2014-12-06 07:07:38

回答

2

我会使用ExecutorService来运行线程。然后我会收到一个Future并使用get()超时取消它。

ExecutorService es = Executors.newFixedThreadPool(1); // You only asked for 1 thread 
Future<?> future = es.submit(new Mythread()); 
try { 
    future.get(timeout, TimeUnit.SECONDS); // This waits timeout seconds; returns null 
} catch(TimeoutException e) { 
    future.cancel(true); 
} 
+0

虽然 – NilsH 2014-12-06 15:21:50

+1

'future.cancel(true)'将会无用,除非该函数被写入正确处理(不只是捕获)InterruptedExceptions和中断。 – VGR 2014-12-06 20:14:42

+0

说有2个线程。说,我希望每个线程单独不超过10秒。说第一个线程需要10秒,第一个将来。get()将等待10s。说第二个线程仍然在运行,第二个线程的future.get()会等待另外10个线程,然后等待20个线程。如何避免这种情况? – user104309 2017-11-07 14:49:24