在线程运行时使用 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 状态。要解决此问题,请生成一个新线程。
但我可能会离开,请发布您的其余代码! :)
我目前正在使用 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 状态。要解决此问题,请生成一个新线程。
但我可能会离开,请发布您的其余代码! :)