2015-08-03 5 views
0

В настоящее время я использую OSGi для создания datamanager, который периодически получает данные от некоторых датчиков. Способ я приобретения данных выглядит следующим образом:Использование консоли 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 работает, а это значит, что нет никакого способа, я могу остановить сверток выполнение с консоли и взаимодействие с исполнением.

Есть ли способ, чтобы bundle работал в другой теме, чем основной?

*** UPDATE: Я вызывал метод запуска напрямую, вместо того чтобы запускать поток, и это было проблемой.

ответ

1

Вы опустили самую важную часть своего кода, так как метод run() фактически выполняется. Тот факт, что он называется run(), предполагает, что метод находится в классе, который реализует Runnable, что, в свою очередь, предполагает, что вы фактически запускаете новый Thread() для его выполнения. Однако я полагаю, что вы на самом деле этого не делаете и запускаете метод непосредственно из потока, который запускает пучки (вызывая его из метода start() BundleActivator). Если это действительно так, никаких других пучков не начнется, и этот пакет останется в состоянии STARTING. Чтобы исправить это, создайте новый поток.

Но, возможно, я не могу опубликовать остальную часть вашего кода! :)

+0

Большое спасибо! Я просто понял, что я не запускаю нить, вместо этого я вызывал метод run напрямую. Вы были в курсе своих предположений! – localhostloco