【发布时间】:2020-05-29 07:54:26
【问题描述】:
我有一个如下结构的 OSGI 包:
//...
public ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
//...
@Activate
public void activate() {
executor.submit(new Runnable() {
@Override
public void run() {
//call 3 functions and log the data
}
}
}
@Deactivate
public void deactivate(){
//call 2 other functions
}
activate 方法中的执行器确保在与所有其他捆绑线程分开的情况下调用 3 个函数,因为这些函数实际上实现了一些复杂的 Windows 消息循环,即 while true 循环,这就是为什么,为了不要阻止其他捆绑包,它会在单独的线程中激活。现在我很遗憾地注意到,为了在 deactivate 方法中运行 2 个函数,我需要在同一个线程中运行它们,其中运行了 activate 方法中的 3 个函数。简单地说,我需要确保我的 bundle 的激活和停用方法在同一个线程中运行,但仍要保持此 bundle 激活(在自己的线程中)与其他 bundle 分开。
我的问题是:如何实现这个?
我不是 Java 并发方面的专家,我也尝试过简单地在 deactivate 方法中调用此执行程序,但我不知道如何使用一个 Runnable 任务来执行此操作,因为在 deactivate 中我只需要调用2 个函数,并且仅激活 3 个函数,不应进行其他调用。
UPD:抱歉,我忘了说,在另一个包中有一个例程,它在某些情况下调用context.getBundle(0).stop() 以调用所有包的停用。如果我只想在 deactivate 方法中添加与 activate 相同的提交例程,那么在这种情况下我可以清楚地看到,提交正文中我的 bundle 的 deactivate 方法中的这两个函数没有被调用。
【问题讨论】:
标签: java concurrency osgi