java killing a thread after timeout value
本问题已经有最佳答案,请猛点这里访问。
我在java中有一个要求,我希望线程在特定时间段之后死掉并自杀,就像它开始处理1分钟后一样。 java为此提供了一种方法吗?
这里要添加的一件事是我正在使用ThreadPoolExecutor并将RUnnable对象提交给ThreadPoolExecutor以在队列中执行。 这是我们框架的一部分,我无法删除ThreadPoolExecutor。 鉴于此,我如何使用ExecutorService?
这是同样的问题。请使用
你不能只是"杀死线程",因为线程可以持有锁或其他资源(如文件)。而是将
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | class StopByPollingThread implements Runnable { private volatile boolean stopRequested; private volatile Thread thisThread; synchronized void start() { thisThread = new Thread(this); thisThread.start(); } @Override public void run() { while (!stopRequested) { // do some stuff here // if stuff can block interruptibly (like calling Object.wait()) // you'll need interrupt thread in stop() method as well // if stuff can block uninterruptibly (like reading from socket) // you'll need to close underlying socket to awake thread try { wait(1000L); } catch (InterruptedException e) { e.printStackTrace(); } } } synchronized void requestStop() { stopRequested = true; if (thisThread != null) thisThread.interrupt(); } } |
此外,您可能希望Goetz在实践中阅读Java并发。
使用
您可以尝试Thread.interrupt(),并在线程本身使用Thread.isInterrupted()检查中断。或者,如果您的线程休眠了一段时间,那么只需退出InterruptedException。这对你正在做的事情非常重要。如果您正在等待IO任务,请尝试关闭该流并退出线程中抛出的IOException。
您可以中断线程,但根据您在工作线程中的操作,您需要手动检查Thread.isInterrupted()。有关详细信息,请参见