2013-04-28 4 views
0

В моем коде мне нужно сделать «getResult» многопоточным.Создание метода многопоточности при возврате значения

Класс X

public x() { 
    } 

public String[] getResult(params) { 
//various actions to generate result 
} 

Класс

X = new X(); 
    String[] getResult = X.getResult(params); 

Так что я сделать класс X работоспособной & есть метод выполнения.

Но переместить вызов getResult в метод run? ... и затем создать класс A, создать новый экземпляр X, проходящий в параметрах.

Когда я это делаю, я не могу вернуть метод запуска. Так что это явно неправильно.

Может кто-нибудь мне помочь. Мне просто нужно сделать класс вызываемым? Или я собираюсь что-то совершенно не так?

+0

Вы хотите сделать метод потокобезопасным, если быть точным? – NINCOMPOOP

+0

Вы хотите запустить фиксированное число потоков или зависит от аргументов? –

+0

В начале кода существует определенное ограничение на количество потоков, которые могут быть созданы, поэтому здесь я не думаю, что важно, сколько раз вызывается «getResult». –

ответ

0

Вам необходимо использовать ThreadLocal, он будет соответствовать вашим требованиям. ThredLocal примет параметр X в качестве параметра, а затем все потоки могут иметь локальный поток.

3

Для каждого отдельного функционального блока вам понадобятся отдельные (потенциально внутренние) классы, которые implement Runnable.

Экземпляры этих классов должны быть созданы и запущены в вашем методе getResult.

Вам нужно будет использовать Thread.join, чтобы getResult подождал, пока каждая нить не закончит и не сравнит результаты.

+0

Спасибо за ответ. Есть некоторые устаревшие классы, которые реализуют Runnable, которые я мог бы расширить. Итак, X.getResult создает экземпляр Y, который запускается ... Если использовать этот способ, что бы я на самом деле положил в run meothd? Было бы пусто? Это небезопасно? Возможные проблемы с процессором? –

0

Когда я это делаю, я не могу вернуть метод запуска. Так что это явно неправильно.

Это не совсем правильно. Вы можете вернуть значение даже из метода run(). Вы можете вернуть значение, обновив атрибут уровня.

public void run(){ 
    //update class attribute here.. using setter method 
} 
0

Там может быть несколько способов, чтобы получить значения, возвращенные из Thread/Runnable метод запуска, хранения возвращаемого значения в глобальной переменной, используйте Callable и т.д. Ниже подход использует Callable.

void asyncRun(final String[] params) 
     { 
      ExecutorService es = Executors.newSingleThreadExecutor(); //or initialize it before 
      Future<String[]> f = es.submit(new Callable<String[]>() { 
       public String[] call() throws Exception { 
       X = new X(); 
       String[] getResult = X.getResult(params); 
       return getResult;    
       } 
      }); 
      // below get call is blocking, you might return Future (f) itself and use it separately 
      try { 
       String[] val = f.get(); // or have a time out 
      } catch (Exception e) { 
       // handle exceptions 
      } 
     } 

Вы вопрос кажется, что вы хотите выполнить getParams в потоке, но нуждается в его результате, когда он завершает, это больше звучит как синхронный подход, хотя.

+0

Может быть неправильно, но не синхронно, просто сделайте его потокобезопасным, а не потоком?Мне действительно не нужен код для безопасного потока (выполняется по одному), мне просто нужно, чтобы он вызывался несколько раз для повышения производительности. –

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