Java 如何在单个线程中执行OSGI bundle的activate和deactivate方法

Java 如何在单个线程中执行OSGI bundle的activate和deactivate方法,java,concurrency,osgi,Java,Concurrency,Osgi,我有一个以下结构的OSGI包: //... public ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); //... @Activate public void activate() { executor.submit(new Runnable() { @Override public void run() { //call 3 func

我有一个以下结构的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方法中的executor确保在一个独立于所有其他bundle的线程中调用3个函数,因为这些函数实际上实现了一些复杂的Windows消息循环,即while true循环,这就是为什么为了不阻止其他bundle,它在一个独立的线程中被激活。现在我遗憾地注意到,为了在deactivate方法中运行2个函数,我需要在同一个线程中运行它们,其中在activate方法中运行了3个函数。简单地说,我需要确定,我的包的activate和deactivate方法在同一个线程中运行,但仍然要将这个包的激活与其他包分开(在自己的线程中)

我的问题是:如何实现这一点

我不是Java并发方面的专家,我也尝试过在deactivate方法中调用这个执行器,但我不知道如何使用一个可运行的任务,因为在deactivate中,我只需调用2个函数,而在activate中只需调用3个函数,不应再进行其他调用


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

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


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

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


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

这听起来像是一个非常常见的问题。我只想明确地说,您正在使用一个线程,并使用线程中为此设计的方法。在激活时启动线程,在停用时中断线程。主循环监视中断状态,并在中断后执行停用功能。中断后,最好加入线程,以确保在后台线程运行完停用函数之前,
activate()
方法不会返回

由于退出框架(停止bundle 0)必须停止所有bundle,并且停止的bundle将停用其组件,因此这应该都可以工作

 public class Foo extends Thread {

      @Activate   void activate()   { start(); }
      @Deactivate void deactivate() throws Exception { interrupt(); join(); }

      public void run() {

            while(!isInterrupted()) try {
              ... your 3 function loop
            } catch( InterruptedException e) {
              break;
            }
            ... 2 deactivate functions
      }
  }

这听起来像是一个非常常见的问题。我只想明确地说,您正在使用一个线程,并使用线程中为此设计的方法。在激活时启动线程,在停用时中断线程。主循环监视中断状态,并在中断后执行停用功能。中断后,最好加入线程,以确保在后台线程运行完停用函数之前,
activate()
方法不会返回

由于退出框架(停止bundle 0)必须停止所有bundle,并且停止的bundle将停用其组件,因此这应该都可以工作

 public class Foo extends Thread {

      @Activate   void activate()   { start(); }
      @Deactivate void deactivate() throws Exception { interrupt(); join(); }

      public void run() {

            while(!isInterrupted()) try {
              ... your 3 function loop
            } catch( InterruptedException e) {
              break;
            }
            ... 2 deactivate functions
      }
  }

谢谢你的评论。事实上,那是我第一次尝试。问题是,另一个bundle中有一个例程,它调用
context.getBundle(0).stop()
,以便为所有bundle调用停用。在这种情况下,我在eclipse中收到一条警告:
停用gp.osgi.executor.internal.pooligexecutor
,我可以清楚地看到,
submit
主体中我的bundle的deactivate方法中的这两个函数没有被调用。很抱歉,我应该在OP POST中提到这一点。在提交runnable以运行这两个方法后,在从deactivate方法返回之前,调用
executor.WaitTermination(…)
,并在适当的超时时间内等待runnable完成。是的。。有道理。谢谢你的评论。事实上,那是我第一次尝试。问题是,另一个bundle中有一个例程,它调用
context.getBundle(0).stop()
,以便为所有bundle调用停用。在这种情况下,我在eclipse中收到一条警告:
停用gp.osgi.executor.internal.pooligexecutor
,我可以清楚地看到,
submit
主体中我的bundle的deactivate方法中的这两个函数没有被调用。很抱歉,我应该在OP POST中提到这一点。在提交runnable以运行这两个方法后,在从deactivate方法返回之前,调用
executor.WaitTermination(…)
,并在适当的超时时间内等待runnable完成。是的。。有道理。