Cela fait presque 9 ans que j'ai posté cette question et, pour être honnête, Java a fait quelques améliorations depuis. Je vais laisser ma réponse originale ci-dessous, mais il n'est pas nécessaire que les gens fassent ce qu'elle contient. Il y a 9 ans, pendant la revue de code, j'aurais demandé pourquoi ils l'ont fait et peut-être approuvé, peut-être pas. Avec les lambdas modernes disponibles, il est irresponsable d'avoir une réponse si fortement votée recommandant une approche désuète (qui, en toute justice, était douteuse au départ...) Dans le Java moderne, cette revue de code serait immédiatement rejetée, et ceci serait suggéré :
void foo(final String str) {
Thread t = new Thread(() -> someFunc(str));
t.start();
}
Comme précédemment, les détails comme le traitement de ce fil de manière significative sont laissés comme un exercice pour le lecteur. Mais pour dire les choses crûment, si vous avez peur d'utiliser des lambdas, vous devriez avoir encore plus peur des systèmes multithreads.
Réponse originale, juste parce que :
Vous pouvez déclarer une classe directement dans la méthode
void Foo(String str) {
class OneShotTask implements Runnable {
String str;
OneShotTask(String s) { str = s; }
public void run() {
someFunc(str);
}
}
Thread t = new Thread(new OneShotTask(str));
t.start();
}
12 votes
Vous pouvez maintenant utiliser
Consumer<T>
.1 votes
J'ai lu les différentes réponses à cette question. Il me semble étrange que personne n'ait dit que vous pouvez ajouter à votre projet les Runnables dont vous avez besoin (avec un, deux, trois ou plusieurs args) en ajoutant simplement une interface appropriée. J'ai créé un gist commenté ici pour ceux qui sont intéressés : gist.github.com/jsfan3/3a66e711fd0fd233c5e4c467184adb7a
0 votes
Ceci n'est PAS un double de "Comment puis-je passer un paramètre à un thread Java". Et la réponse moderne est, comme le dit @Alex78191 : utiliser
Consumer<T>