所以,我有一个OSGi包,可以创建一个像这样的计时器......
Timer timer = new Timer(true);
// running timer task as daemon thread
timer.scheduleAtFixedRate(this, 0, 2 * 1000);//my class extends the timer task
// cancel after 60s
try
{
Thread.sleep(60000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
finally
{
timer.cancel();
}
只要在计时器任务结束之前没有停止OSGi包,这就可以正常工作。如果我试图在定时器超时之前停止捆绑(即60秒),我得到一个例外,即捆绑不能干净地停止。
在我的捆绑的取消激活方法中,我取消了计时器,但我想因为线程正在休眠,捆绑的停止在超时之前没有被调用
我只是想了解是否有一种方法可以在超时之前停止捆绑,这也会杀死计时器任务?
答案 0 :(得分:3)
您可以使用interrupts取消线程。在并发性方面,OSGi与其他应用程序没有什么不同。
您发布的代码应该在自己独立的线程中运行,您需要保留对该线程的引用。当bundle被停用时,使用Thread.interrupt()
向该线程发送一个中断。你的代码实际上已经工作了,但可能不想打印堆栈跟踪。这是一个例子:
cancelTimerThread = new Thread() {
public void run() {
try {
Thread.sleep(60000);
}
catch (InterruptedException e) {
log.debug("timer canceled by bundle stop");
}
timer.cancel();
}
}
cancelTimerThread.start();
关于捆绑停用:
public void stop() {
// signal thread to cancel timer early
cancelTimerThread.interrupt();
}
请注意,使用timer.cancel()
时,当前正在运行的计时器任务将不会中止。如果它是一个长时间运行的任务,你也应该向该任务发送一个中断。