我有这段代码:
Timeout s = new Timeout();
Timer timer = new Timer();
timer.schedule(s, 1000L); // fires after 1 second
如何将自己的代码作为一个线程单独启动?我是否需要将计时器和Timeout传递给Runnable然后启动它?如果线程的Run()在定时器被触发之前结束会发生什么?
我正在考虑这样做:
ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
Timeout s = new Timeout(); // Timeout is a runnable
ses.schedule(s, 10, TimeUnit.SECONDS);
但是如何在超时后退出线程?一段时间后我用完了线程
由于
答案 0 :(得分:2)
我不确定你在问什么,但我会试一试。
如何将以下代码作为线程单独启动?
简而言之......
Timeout.java
public class Timeout extends TimerTask {
boolean isDone = false;
@Override
public void run() {
// TODO something
synchronized(this) {
isDone=true;
this.notifyAll();
}
}
public synchronized void join() throws InterruptedException {
while(!this.isDone)
this.wait();
}
}
TimeoutRunner.java
public class TimerRunner implements Runnable {
@Override
public void run() {
Timeout timeout = new Timeout();
Timer timer = new Timer();
timer.schedule(timeout, 1000L);
try {
timeout.join();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
timer.cancel();
}
}
}
使用以下命令运行TimeoutRunner:
new Thread(new TimeoutRunner()).start();
join方法将阻塞线程,直到超时任务完成执行。那时你可以关闭Timer。然而,这是很多线程创建,以及IMO糟糕的编程。
创建Timer实例时,会创建一个线程来执行Timeout#run()方法。计时器有自己的run方法,直到你的任务准备好执行为止。在给定的超时时间过去之后,计时器解除阻塞并执行超时。
您的TimeoutRunner线程将阻塞,直到超时操作完成。只有这样,这个线程才会死亡。
Timer类非常有限。您需要为每个任务创建一个新实例。在我的选项中,ScheduledExecutorService是一个更好的选择。只要您计划执行任务,就保持ScheduledExecutorService处于打开状态。如果您需要类似计划的缓存线程池,请随意使用我的一个开源项目(Scheduler)中的此类。这适用于缓存的线程池。