2015-12-22 2 views
0

У меня есть базовый абстрактный класс. Существует несколько классов, которые простираются от этого класса. Они могут быть указаны как разные плагины. Тогда есть основной класс, который запускает эти плагины с помощью отражения. Мне нужно запустить каждый плагин в отдельном потоке. Ниже приведены строки, которые запускают плагины с использованием отражения.Запуск различных плагинов в разных потоках

Class<?> c = cl.loadClass(className); 
if (className.endsWith(currentPlugin.messageListner)) { 
    // The MessageListner class found ... 
    TestMessageListener messageListner = null; 
    messageListner = (TestMessageListener) c.getConstructor(MessageBus.class, String.class) 
      .newInstance(messageBus, currentPlugin.initParam); 
    if (messageListner.start() == false) { 
     currentPlugin.loadStatus = "failed"; 
     currentPlugin.errorCode = "Plugin start failed."; 
    } else { 
     currentPlugin.loadStatus = "success"; 
     currentPlugin.errorCode = ""; 
    } 
    break; 
} 

Так я подумал о обертывании выше сегмента кода в поток, как он будет выполнен для каждого плагин (Это внутри цикла в то время). Есть ли другие способы, которыми я мог бы это сделать? Ниже приведена структура моего базового класса.

public abstract class TestMessageListener implements MessageListener { 

    protected String initParam; 

    protected int instanceId; 

    public TestMessageListener(MessageBus messageBus, String initParam) { 
     if (messageBus == null) { 
      throw new NullPointerException(); 
     } 
     this.messageBus = messageBus; 
     this.initParam = initParam; 
     String[] params = initParam.split(","); 
     if ((params.length >= 1) && !params[0].isEmpty()) { 
      // assign the first parameter as the instanceId 
      instanceId = Integer.parseInt(params[0]); 
     } 
    } 
    public abstract boolean start(); 
} 
+0

какой код нужно выполнить в отдельных thread.Is него метод запуска каждого messagelistner? –

+0

Да, загрузка конструктора через отражение и вызов метода запуска. Эти две строки, которые мне нужно вызывать в отдельном потоке для каждого плагина. – mayooran

+0

Почему вы кладете 'break;' после загрузки одного класса? Вам нужен только один класс/плагин для загрузки –

ответ

1

Вы можете попробовать это:

if (className.endsWith(currentPlugin.messageListner)) { 
    new Thread(new Runnable() { 

      @Override 
      public void run() { 
       //your thread code 
       TestMessageListener messageListner = null; 
        messageListner = (TestMessageListener) c.getConstructor(MessageBus.class, String.class) 
          .newInstance(messageBus, currentPlugin.initParam); 
        if (messageListner.start() == false) { 
         currentPlugin.loadStatus = "failed"; 
         currentPlugin.errorCode = "Plugin start failed."; 
        } else { 
         currentPlugin.loadStatus = "success"; 
         currentPlugin.errorCode = ""; 
        } 

      } 
     }).start();//starting the thread 
} 
+0

Таким образом, это приведет к тому, что выполнение всех методов во всех плагинах будет выполняться в разных потоках правильно? Я имею в виду поток для плагина? – mayooran

+0

правильный. У вас есть только метод запуска в плагине. правильно? –

+0

После запуска плагина я вызываю в них другие методы. Разве они не будут работать в потоке, в котором их объект был создан? – mayooran

Смежные вопросы