2013-04-13 4 views
0

Comment passer un argument à ScheduledThreadPoolExecutor?Comment passer un argument à ScheduledThreadPoolExecutor?

J'ai le code suivant. Vous remarquerez que j'ai déclaré une variable 'num' et qu'elle est passée en argument à exampleFunction(). exampleFunction contient un ScheduledThreadPoolExecutor. Je veux pouvoir utiliser la variable 'num' dans le public void run(). Y a-t-il un moyen de le faire?

 class Test { 
    ... 
    int num; 
    exampleFunction(num); 
    ... 

    public void exampleFunction(num) { 
     ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1); 
     exec.schedule(new Runnable() { 
      public void run() { 
       ...do something here... 
       ...something with 'num' here... 
       ...i get an error when i try to use 'num' here 
      } 
     }, 10, TimeUnit.SECONDS); 
    } 

} 
+0

s'il vous plaît mettre un peu plus d'effort dans le marquage de votre question: il est multithreading java simple, sans lien avec swing/x, java-ee – kleopatra

Répondre

3

Avez-vous essayé de changer exampleFunction(num) comme exampleFunction(final int num)? Puisque la méthode run est dans une classe interne, toutes les liaisons externes doivent être finales.

public void exampleFunction(final int num) { // final int here 
    ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1); 
    exec.schedule(new Runnable() { 
     public void run() { 
      ...do something here... 
      ...something with 'num' here... 
      ...i get an error when i try to use 'num' here 
     } 
    }, 10, TimeUnit.SECONDS); 
} 
+0

Cela a fonctionné! Cela fonctionnerait-il encore si la valeur de 'num' ne cesse de changer? Si 'num' était dans une boucle et que sa valeur continuait à changer dans la boucle, et que exampleFunction() est appelée pour chaque valeur de 'num', alors déclarer num comme 'final int num' fonctionne toujours? – user2263104

0

vous déclare num final variable et vous serez en mesure de l'utiliser dans la méthode Run().

écrire à la place

final int num; 
4

Ou faire numfinal ou static (ou accessible à partir d'une méthode static), ou bien créer votre propre Runnable.

class MyRunnable implements Runnable { 
    int num; 

    public MyRunnable(int num) { 
     this.num = num; 
    } 

    public void run() { ... } 
} 
Questions connexes