我有一个任务执行器,它将runnable
作为一项任务。我在调用runnable.run()
方法之前启动一个计时器,并在runnable完成时停止它。如果计时器超过时间限制,我想从执行程序本身终止run()
方法的执行。我不知道用户将在run()
中实施什么。
TaskExecutor.add(new Runnable () {
@Override
public void run() {
System.out.println("This is test job");
}}
);
这是用户添加新任务的方式。每个任务都在同一个线程中运行。
修改
此任务执行程序将充当用户的service
。并且因为创建线程是昂贵的操作并且需要native
OS调用,所以我试图避免它们。否则我会在某个时候打电话给Thread.interrupt()
。但我只是想知道是否有办法从父对象终止 run()
方法。终止意味着突然停止某些事情。我们如何在OS任务管理器中终止进程。
如何执行任务
while (jobQueue.isEmpty()) {
for (Job job : jobQueue) {
long startTime = System.currentTimeMillis();
job.run();
//There is a separate thread which checks
//for timeout flags by comparing the startTime
//with the current time. But all tasks are
//executed in the same thread sequentially. I
//only want to terminate single jobs that are
//timed out.
}
}
答案 0 :(得分:0)
你可以检查你的计时器的条件,如果计时器超过你可以打断你的线程,如 -
Thread.currentThread().interrupt();
它会停止你当前的线程。
答案 1 :(得分:0)
我只想知道是否有办法从父对象终止run()方法。
你无法真正终止某个方法,而且你无法真正从对象中做任何事情。
通常很方便地说“此对象执行 X ”或“此方法执行 Y ”,但对象和方法实际上并没有做任何事情。当你谈论多线程代码时,重要的是要意识到程序所做的一切都是由线程完成的。方法只是告诉线程做什么的指令,而对象就是线程所做的事情。
你可以中断一个线程,如果该线程被设计为优雅地处理中断,那么这只是一个好主意;你可以终止一个线程,基本上永远是一个好主意。
线程应始终彼此合作。您需要提供一种方法,通过该方法,您的程序可以礼貌地询问客户提供的回调以中止其工作并提前返回。如果客户端代码不尊重您的请求(即,如果客户端代码不合作),则客户端程序员因不遵守您的准则而出现错误。
最简单的方法是简单地公开客户端可以定期检查的一些static boolean
方法,看看是否该中止。