我想在一段固定的时间内运行一个线程.如果它没有在那段时间内完成,我想杀死它,抛出一些异常,或以某种方式处理它.怎么做到呢?
我从这个线程 中发现的一种方法是在Thread的run()方法中使用TimerTask.
有没有更好的解决方案呢?
编辑:添加赏金,因为我需要一个更清晰的答案.下面给出的ExecutorService代码没有解决我的问题.为什么我应该在执行后睡觉()(一些代码 - 我没有处理这段代码)?如果代码完成并且sleep()被中断,那怎么可能是timeOut?
需要执行的任务不在我的控制范围内.它可以是任何一段代码.问题是这段代码可能会遇到无限循环.我不希望这种情况发生.所以,我只想在一个单独的线程中运行该任务.父线程必须等到该线程完成并且需要知道任务的状态(即它是否超时或发生了一些异常或者是否成功).如果任务进入无限循环,我的父线程会无限期地等待,这不是一个理想的情况.
我通过实现runnable接口创建了类,然后在我的项目的其他一些类中创建了许多线程(将近10个).
如何阻止其中一些线程?
在我的Web应用程序中,有一些请求持续时间超过20秒.但在某些情况下,代码可能导致无限循环或类似的东西,从而减慢服务器的速度.
我想在服务器端将请求超时60秒.这是在tomcat中实现的吗?
谢谢,Horatiu
我正在使用新concurrent.futures模块(也有一个Python 2 backport)来做一些简单的多线程I/O. 我无法理解如何干净地杀死使用此模块启动的任务.
查看以下Python 2/3脚本,它重现了我所看到的行为:
#!/usr/bin/env python
from __future__ import print_function
import concurrent.futures
import time
def control_c_this():
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
future1 = executor.submit(wait_a_bit, name="Jack")
future2 = executor.submit(wait_a_bit, name="Jill")
for future in concurrent.futures.as_completed([future1, future2]):
future.result()
print("All done!")
def wait_a_bit(name):
print("{n} is waiting...".format(n=name))
time.sleep(100)
if __name__ == "__main__":
control_c_this()
Run Code Online (Sandbox Code Playgroud)
当这个脚本运行时,似乎无法使用常规的Control-C键盘中断干净地杀死它.我在OS X上运行.
kill从命令行求助于杀死脚本.Control-C被忽略了.我在网上找到的大多数文档都讨论了如何用旧threading模块干净地杀死线程.这似乎都不适用于此.
concurrent.futures模块中提供的所有停止内容(如Executor.shutdown()和Future.cancel())的方法仅在Futures尚未启动或完成时才起作用,这在这种情况下毫无意义.我想立即打断未来.
我的用例很简单:当用户点击Control-C时,脚本应该像任何行为良好的脚本一样立即退出.这就是我想要的.
那么在使用时获得此行为的正确方法是concurrent.futures什么?
我有一个启动Thread和Runnable的服务.
t = new Thread(new Runnable() {
public void run() {
doSomething();
}
});
t.start();
Run Code Online (Sandbox Code Playgroud)
该线程的原因是执行异步任务doSomething().现在让我们不要担心其他类AsyncTask.我已经尝试过它并不适用于我的情况.编辑:我不能使用AsyncTask,因为它仅适用于UI线程.这段代码必须在服务内部运行,所以nope,没有AsyncTask :(
doSomething()包含一些外部库,所以我遇到的问题是它可能挂在其中一个命令上,而不返回任何值(因此甚至不能进行错误检查)
为解决这个问题,我希望在某些时候破坏服务.
stopService(new Intent("net.MyService.intent));
Run Code Online (Sandbox Code Playgroud)
这很好,很容易在手机上验证.但是,即使生成它的服务被销毁,上面创建的Thread也将继续运行.
因此,我正在寻找在Service的onDestroy()中插入的正确命令,它将为我清理Thread.
t.destroy();
t.stop();
Run Code Online (Sandbox Code Playgroud)
都折旧并导致应用程序崩溃.
我从某个地方拿了这个代码
@Override
public void onDestroy() {
Thread th = t;
t = null;
th.interrupt();
super.onDestroy();
}
Run Code Online (Sandbox Code Playgroud)
但它仍然无效,线程继续运行.有帮助吗?
有没有办法从线程的OUTSIDE停止另一个线程?就像,如果我运行一个线程来运行该线程并导致该线程停止?它会阻止其他线程吗?
有没有办法在没有循环的情况下从内部停止线程?例如,如果您正在理想地下载,则需要使用循环,如果我使用循环,则无法暂停它直到它到达循环结束.
boolean cancel(boolean mayInterruptIfRunning)
Run Code Online (Sandbox Code Playgroud)
尝试取消执行此任务.如果任务已完成,已取消或由于某些其他原因无法取消,则此尝试将失败.如果成功,并且在调用cancel时此任务尚未启动,则此任务永远不会运行.如果任务已经启动,则mayInterruptIfRunning参数确定执行此任务的线程是否应该在尝试停止任务时被中断.
我的问题是,如果mayInterruptIfRunning为false,取消会怎么做?
如果任务已经运行,它如何取消或停止执行?
我有工作的春季MVC应用程序,我接下来要做的是从我的应用程序启动或提交后台任务.
基本上,即使用户决定在应用程序上执行其他操作,我也会继续执行任务,直到完成为止.
但是如果需要的话,我还想停止/杀死/暂停任务.因为在我寻找一个好的/更好的方法之前我没有这样做过.
我发现这些很有用:
http://blog.springsource.com/2010/01/05/task-scheduling-simplifications-in-spring-3-0/
Java线程:是否可以从同一JVM上运行的不同java程序查看/暂停/终止特定线程?
所以我想使用@Async任务来提交我的后台任务,但是想要稍后使用线程的id获取它并在需要时停止它?
这是正确的方法吗?我对多线程没有任何经验,所以我在这里听.
代码更新:
public interface Worker {
public void work();
public void cancel();
}
Run Code Online (Sandbox Code Playgroud)
实施:
@Component("asyncWorker")
public class AsyncWorker implements Worker {
@Async
public void work() {
String threadName = Thread.currentThread().getName();
System.out.println(" " + threadName + " beginning work");
try {
Thread.sleep(10000); // simulates work
} catch (InterruptedException e) {
System.out.println("I stopped");
}
System.out.println(" " + threadName + " completed work");
}
public void cancel() { Thread.currentThread().interrupt(); }
}
Run Code Online (Sandbox Code Playgroud)
控制器用于测试目的:
@ResponseBody
@RequestMapping("/job/start")
public …Run Code Online (Sandbox Code Playgroud) 当我spawn在Rust中使用一个线程时,我得到一个JoinHandle,这对于...加入(一个阻塞操作)是好的,而不是其他的.如何检查子线程是否JoinHandle.join()已从父线程退出(即,不会阻止)?如果您知道如何杀死子线程,则可获得奖励积分.
我想你可以通过创建一个频道,向孩子发送一些东西,捕捉错误来做到这一点,但这似乎是不必要的复杂性和开销.
我有一个Java方法,它对输入集执行两次计算:估计和准确的答案.估计总是可以廉价地在可靠的时间内计算出来.准确的答案有时可以在可接受的时间内计算,有时不会(不知道先验......必须试着看).
我想要设置的是一些框架,如果准确答案花费太长时间(固定超时),则使用预先计算的估计.我想我会使用一个线程.主要的复杂因素是计算准确答案的代码依赖于外部库,因此我无法"注入"中断支持.
针对此问题的独立测试用例就在这里,展示了我的问题:
package test;
import java.util.Random;
public class InterruptableProcess {
public static final int TIMEOUT = 1000;
public static void main(String[] args){
for(int i=0; i<10; i++){
getAnswer();
}
}
public static double getAnswer(){
long b4 = System.currentTimeMillis();
// have an estimate pre-computed
double estimate = Math.random();
//try to get accurate answer
//can take a long time
//if longer than TIMEOUT, use estimate instead
AccurateAnswerThread t = new AccurateAnswerThread();
t.start();
try{
t.join(TIMEOUT);
} catch(InterruptedException ie){
;
}
if(!t.isFinished()){
System.err.println("Returning estimate: …Run Code Online (Sandbox Code Playgroud)