2016-11-13 6 views
0

У меня есть класс Looper, который возвращает массив Integer следующим образом:Как получить/вернуть массив целых чисел из метода Runnable run(), имеющий цикл while?

public class Looper implements Runnable{ 

    public AtomicBoolean keepRunning; 

    public Looper() { 
     keepRunning = new AtomicBoolean(true); 
    } 

    public void stop() { 
     keepRunning.set(false); 
    } 

    @Override 
    public void run() { 

     try { 
      . 
     . 
     . 
      while (keepRunning.get()) { 


        int[] A = ..... ;      

      } 

    } 

} 

int[] A будет иметь разные значения после каждой итерации цикла While. Теперь скажите, что есть другой метод в том же классе, что и saveReturnValue, который будет хранить целочисленный массив после каждого цикла while и выполнять некоторые операции над ним. Но из-за void природы Runnable, я не могу получить значение A в других методах. Есть ли способ получить доступ к int[] A вне этого метода?

+1

Даже если 'run()' были не пустыми, вы могли бы только вернуть значение один раз. Возможно, вы ищете какую-то очередь, которую могут прочитать другие потоки? Похоже на основную ситуацию с производителем/потребителем. – Kayaman

+0

Да, так есть способ получить его? Спасибо хоть..!! –

+0

Как я уже сказал. Очередь. Производитель/потребитель. – Kayaman

ответ

0

Как указано в комментариях, вы можете использовать Google для примера «Пример очереди Java-продюсера», а затем исправить этот код в соответствии с вашими потребностями.

Общая идея заключается в использовании структуры данных, из которой читается одна нить, а другая - как, например, ниже.

public class Producer implements Runnable{ 
    private LinkedBlockingQueue<int[]> queue; 

    public Producer(LinkedBlockingQueue<int[]> queue) { this.queue = queue;} 

    @Override 
    public void run() { 
     while (keepRunning.get()) { 
       int[] a = ..... ;      
       queue.add(a); 
     } 
    } 

public class Consumer implements Runnable{ 
    private LinkedBlockingQueue<int[]> queue; 

    public Consumer(LinkedBlockingQueue<int[]> queue) { this.queue = queue;} 

    @Override 
    public void run() { 
     while (keepRunning.get()) { 
      int[] a = queue.take(a); 
      saveValue(a); 
     } 
    } 

public class MainOrWhatever { 
    public void whateverMethod { 
     LinkedBlockingQueue<int[]> theQueue = new LinkedBlockingQueue<int[]>(); 
     Consumer consumer = new Consumer(queue); 
     Producer producer = new Producer(queue); 
     executorService.submit(consumer); 
     executorService.submit(producer); 
     ... 
    } 
}