在线程运行时使用 OSGi 控制台

Using OSGi console during a thread runtime

我目前正在使用 OSGi 开发一个定期从一些传感器获取数据的数据管理器。我获取数据的方式如下:

public void run() {
        while (!stop || !Thread.currentThread().isInterrupted()) {
            try {
                List<DataEntry> aux;
                long millis = System.currentTimeMillis();
                for (DataLogger dl : loggers) {
                    String name = dl.getDriverName();
                    aux = dataTable.get(name);
                    if (aux == null) {
                        aux = new ArrayList<DataEntry>();
                    }
                    dl.readValue();
                    DataEntry de = new DataEntry(dl.getCurrentValue(), millis);
                    aux.add(de);
                    dataTable.put(dl.getDriverName(), (ArrayList<DataEntry>) aux);
                }
                Thread.sleep(PERIOD);


            // ***** Exceptions *****
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

我面临的问题是我无法与 console 交互,而 thread 是 运行ning,这意味着我无法停止捆绑执行从控制台并与执行交互。

有什么方法可以让 bundle 运行 与主线程在不同的线程中?

*** 更新: 我是直接调用 运行 方法,而不是启动线程,这就是问题所在。

您省略了代码中最重要的部分,即 运行() 方法的实际执行方式。它被称为 运行() 的事实表明该方法位于实现 Runnable 的 class 中,这反过来表明您实际上正在启动一个新的 Thread() 来执行它。但是,我从您的问题中猜测您实际上并没有这样做,而是直接从启动捆绑包的线程 运行ning 方法(从 BundleActivator 的 start() 方法调用它)。如果情况确实如此,则不会启动其他捆绑包,并且该捆绑包将保持在 STARTING 状态。要解决此问题,请生成一个新线程。

但我可能会离开,请发布您的其余代码! :)