2016-11-13 1 views
0

J'ai un Looper classe qui retourne un tableau entier comme suit:Comment obtenir/retourner un tableau Integer à partir d'une méthode runnable run(), ayant une boucle 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 aura une des valeurs différentes après chaque itération en boucle. Dites maintenant qu'il existe une autre méthode dans la même classe que saveReturnValue qui stockera le tableau d'entiers après chaque exécution de la boucle while et effectuera certaines opérations sur celle-ci. Mais en raison de void nature de Runnable, je suis incapable d'obtenir la valeur de A dans les autres méthodes. Existe-t-il un moyen d'accéder à int[] A en dehors de cette méthode?

+1

Même si 'run()' n'était pas vide, vous ne pourriez retourner qu'une seule valeur. Peut-être cherchez-vous une sorte de file d'attente que d'autres threads peuvent lire? On dirait une situation de producteur/consommateur de base. – Kayaman

+0

Oui, donc est-il possible de l'obtenir? Merci quand même..!! –

+0

Comme je l'ai dit. Queue. Producteur/consommateur. – Kayaman

Répondre

0

Comme indiqué dans les commentaires, vous pouvez rechercher "Java Producer Consumer Queue exemple" dans google, puis corriger ce code en fonction de vos besoins.

L'idée générale est d'utiliser une structure de données à partir de laquelle un thread lit et l'autre écrit, comme ci-dessous.

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); 
     ... 
    } 
}