gpt4 book ai didi

java - 如何在单线程中执行OSGI包的激活和停用方法

转载 作者:行者123 更新时间:2023-12-01 16:29:19 25 4
gpt4 key购买 nike

我有一个具有以下结构的 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 循环,这就是为什么,为了不要阻止其他 bundle ,它会在单独的线程中激活。现在我悲伤地注意到,为了在 deactivate 方法中运行 2 个函数,我需要在同一个线程中运行它们,其中运行 activate 方法中的 3 个函数。简而言之,我需要确保我的 bundle 的激活和停用方法在同一个线程中运行,但仍保持此 bundle 激活与其他 bundle 分开(在自己的线程中)。

我的问题是:如何实现这个?

我不是 Java 并发方面的专家,我也尝试过在 deactivate 方法中简单地调用这个执行器,但我不知道如何使用一个 Runnable 任务来做到这一点,因为在 deactivate 中我只需调用2 个函数,并且仅激活 3 个函数,并且不应进行其他调用。

UPD:抱歉,我忘了提及,另一个包中有一个例程,它在某些情况下调用 context.getBundle(0).stop()为了调用所有 bundle 的停用。如果我只想在 deactivate 方法中添加与 activate 中相同的提交例程,那么在这种情况下我可以清楚地看到,提交主体中我的包的 deactivate 方法中的这两个函数没有被调用。

最佳答案

只需在停用中执行另一个 executor.submit 即可。由于它是一个单线程执行器,它将确保只有一个线程处理两者。

唯一的问题是如何可靠地关闭执行器。通常,停用组件后应该关闭其所有资源。

关于java - 如何在单线程中执行OSGI包的激活和停用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62081207/

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