【问题标题】:Thread that implements a wait method in OSGi without stopping other bundles在 OSGi 中实现等待方法而不停止其他包的线程
【发布时间】:2014-02-18 11:47:45
【问题描述】:

我在尝试集成实现 倒计时 以在特定时间间隔内发送消息的 OSGi 包时遇到问题。这是由可运行的类或线程完成的。

想法是下一个;我有捆绑 Sender、捆绑 Receiver 和捆绑 Countdown

Sender bundle 在一段时间后发送一条消息,例如:5 秒。

发件人 ->创建消息

倒计时 -> 数到 5 秒。

Receiver -> 5 秒后收到消息。

这只是我的应用程序的“隐喻”,但是,我相信你明白了。

我遇到的问题是下一个问题:当捆绑包 Countdown 运行 5 秒倒计时,捆绑包 Sender 停止工作(它是好的,这里没问题),但捆绑包 Receiver 也停止工作。我的想法是在单独的包中实现倒计时只是为了避免其他包停止工作,但我想我错了。

所以,我的问题是……我怎样才能实现倒计时,而不会不必要地停止 OSGi 应用程序的所有捆绑包?

提前致谢。


一些代码:

Countdown

public void countDown()
{
   int i = delay;
   while (i>0){
      try {
        i--;
        Thread.sleep(1000);    // 1000ms = 1 s
      }
      catch (InterruptedException e) {
        //countdown failure? --> nah
      }
    }
}

Sender

Thread t = new Thread(new Countdown(5));
t.start();
while (t.isAlive());
System.out.println("Sending the message");

【问题讨论】:

  • 我们能否查看一些代码以便诊断问题?
  • 是的,当然。只需一分钟

标签: java multithreading osgi osgi-bundle


【解决方案1】:

OSGi 包既不是单独的进程,也不是单独的线程。一个包不会“运行”——它的代码在任何时候都会发现自己处于零个或多个线程的执行路径上。

因此,您的问题根本不是关于 OSGi,而是关于 Java 中的一般多线程。如果您想在等待应答时阻塞一个线程,并希望其他代码继续运行,那么您必须确保其他代码有自己的线程在其中运行。

【讨论】:

  • 这就是我添加多线程标签的原因:)。这个标题可能会让你感到困惑,但由于我在 OSGi 工作,我认为它可能对那些遇到同样问题的人有所帮助。如果我理解正确,如果其他捆绑包没有运行自己的线程,那么其他捆绑包上的等待方法总是会让它们停止?
  • 我认为,一旦你放弃“运行包”范式并开始考虑运行线程,你就会意识到你可以自己回答这个问题。
  • 我有一个建议。我只有一个线程,所以不是让一个包等待线程完成,而是在倒计时到 0 时从线程本身“触发触发器”。
  • 好吧,正如我在我的问题中所写,捆绑包执行此操作:while (t.isAlive());我知道这不是一个 wait() 方法,但实际上它为这个特定的例子做了同样的事情。那时正在停止整个应用程序,因此我不会“等待”它完成,而是让它运行,当它完成倒计时时,我会让他调用下一个操作,即发送消息。希望这是解决我的特定问题的正确方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多