Java:线程/任务在指定毫秒后过期
在Java中,有没有一种合理的方法让线程/任务连续运行,然后在指定的运行时间后结束(最好不使用几个计时器) 例如,如果我有一个任务,似乎没有一种方法可以将该任务安排在特定的毫秒数之后或在类的特定时间结束 当然,我可以在几毫秒后将任务安排到,但是如果我希望它在一次迭代后结束呢?我必须在此计划任务中运行另一个计时器?我希望有一个更优雅的答案 中提供的答案可能有效,但绝对不是我所想的Java:线程/任务在指定毫秒后过期,java,multithreading,concurrency,scheduled-tasks,timertask,Java,Multithreading,Concurrency,Scheduled Tasks,Timertask,在Java中,有没有一种合理的方法让线程/任务连续运行,然后在指定的运行时间后结束(最好不使用几个计时器) 例如,如果我有一个任务,似乎没有一种方法可以将该任务安排在特定的毫秒数之后或在类的特定时间结束 当然,我可以在几毫秒后将任务安排到,但是如果我希望它在一次迭代后结束呢?我必须在此计划任务中运行另一个计时器?我希望有一个更优雅的答案 中提供的答案可能有效,但绝对不是我所想的 本质上,我正在寻找类似于C#的System.Timers.Timer类的属性。如果您的任务在循环中运行,您可以在每次迭
本质上,我正在寻找类似于C#的
System.Timers.Timer
类的属性。如果您的任务在循环中运行,您可以在每次迭代中检查当前时间,并在经过足够时间后终止循环
或者,如果您的任务涉及睡眠,您可以在另一个线程上设置计时器以调用任务上的thread.interrupt
唯一的其他选项是在另一个线程上设置一个计时器来调用
thread.stop
。但是,Thread.stop
,在Java中没有安全的方法来停止普通线程 如果您的任务在循环中运行,您可以检查每次迭代的当前时间,并在经过足够的时间后终止循环
或者,如果您的任务涉及睡眠,您可以在另一个线程上设置计时器以调用任务上的thread.interrupt
唯一的其他选项是在另一个线程上设置一个计时器来调用
thread.stop
。但是,Thread.stop
,在Java中没有安全的方法来停止普通线程 只需创建另一个线程,并在它希望另一个线程停止时计时:
class ThreadTimer implements Runnable {
public void run()
{
Thread.sleep(3000);
MainThread.stopThread();
}
}
class MainThread implements Runnable {
public boolean running = true;
public void run()
{
// thread running code
if(!running)
return;
}
public static void stopThread()
{
running = false;
}
}
其中3000
是希望线程停止后的时间量(以毫秒为单位)
由于Java中不推荐使用Thread.stop()
,因此,下一个最好的方法是仅在布尔值设置为true时执行线程。当您调用停止线程时,您将该布尔值设置为false,使线程中的代码不运行
由于void run()不会重复自身并且只执行一次,因此如果将布尔值设置为false,它只会返回
run()
,并停止线程的执行 只需创建另一个线程,并在它希望另一个线程停止时计时:
class ThreadTimer implements Runnable {
public void run()
{
Thread.sleep(3000);
MainThread.stopThread();
}
}
class MainThread implements Runnable {
public boolean running = true;
public void run()
{
// thread running code
if(!running)
return;
}
public static void stopThread()
{
running = false;
}
}
其中3000
是希望线程停止后的时间量(以毫秒为单位)
由于Java中不推荐使用Thread.stop()
,因此,下一个最好的方法是仅在布尔值设置为true时执行线程。当您调用停止线程时,您将该布尔值设置为false,使线程中的代码不运行
由于void run()不会重复自身并且只执行一次,因此如果将布尔值设置为false,它只会返回
run()
,并停止线程的执行 您可以使用执行器服务
,抓取您获得的未来
,然后取消()
final Future<Whatever> f = executor.submit(...);
TimeUnit.SECONDS.sleep(xxx);
f.cancel(true);
最终未来f=执行人。提交(…);
时间单位。秒。睡眠(xxx);
f、 取消(真);
或者您可以有两个服务:一个执行,另一个使用ScheduledExecutorService
进行取消
注意:TimerTask
取决于系统时间,请改用ScheduledExecutorService
。您可以使用ExecutorService
,抓取您获得的未来
,然后取消()
final Future<Whatever> f = executor.submit(...);
TimeUnit.SECONDS.sleep(xxx);
f.cancel(true);
最终未来f=执行人。提交(…);
时间单位。秒。睡眠(xxx);
f、 取消(真);
或者您可以有两个服务:一个执行,另一个使用ScheduledExecutorService
进行取消
注意:TimerTask
取决于系统时间,请改用ScheduledExecutorService
。在run
方法中,跟踪方法启动的时间和循环,直到达到所需的“超时”…在run
方法中,跟踪方法启动和循环的时间,直到达到所需的“超时”…将此设置为答案,因为它符合我的标准。我会让你知道它是如何满足我的需要的。因为它符合我的标准,所以我会将此设置为答案。我会让你知道它是如何满足我的需要的。