gpt4 book ai didi

java - 停止 OSGI 包中的计时器

转载 作者:行者123 更新时间:2023-11-29 05:10:09 26 4
gpt4 key购买 nike

所以,我有一个 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 秒)之前停止 bundle ,我会得到一个异常,即 bundle 无法完全停止。

在我的 bundle 的 deactivate 方法中,我取消了计时器,但我猜因为线程正在 hibernate ,所以 bundle 的停止在超时之前没有被调用

我只是想了解是否有一种方法可以在超时之前停止 bundle ,这也会终止计时器任务?

最佳答案

您可以使用 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() 时,当前正在运行的计时器任务不会被中止。如果这是一项长时间运行的任务,您可能也应该向该任务发送一个中断。

关于java - 停止 OSGI 包中的计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28886584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com