我具有以下结构的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真正的循环,因此,为了不阻止其他包,则在单独的线程中激活它。现在,我不幸地注意到,为了在deactivate方法中运行2个函数,我需要在同一线程中运行它们,其中在activate方法中运行了3个函数。简而言之,我需要确保我的捆绑软件的激活和停用方法在同一线程中运行,但仍要保持捆绑软件的激活(在自己的线程中)与其他捆绑软件分开。
我的问题是:如何实施?
我不是Java并发专家,我也尝试过简单地在deactivate方法中调用该执行程序,但是我不知道如何使用一个Runnable任务来执行此操作,因为在deactivate中,我只需要调用2功能,并且仅激活3个功能,不得进行其他调用。
UPD:抱歉,我忘了提及,另一个捆绑包中有一个例程,该例程在某些情况下调用context.getBundle(0).stop()
,以便为所有捆绑包调用停用功能。如果我只想在取消激活方法中添加与激活相同的提交例程,那么在这种情况下,我会在eclipse中收到红色警告:Deactivating gp.osgi.executor.internal.PoolingExecutor
,我可以清楚地看到,这两个函数来自我捆绑软件的取消激活方法在提交人的身体中没有被调用。
只需停用另一个executor.submit。因为它是单线程执行程序,所以将确保只有一个线程同时处理这两个程序。
唯一的问题是如何可靠地关闭执行器。通常,在停用某个组件之后,应该已经关闭了其所有资源。