Java: Exécutable paramétrable
Standard Runnable
interface a seulement non paramétrées run()
méthode. Il est également Callable<V>
interface avec call()
méthode retournant le résultat de type générique. J'ai besoin de passer de paramètre générique, quelque chose comme ceci:
interface MyRunnable<E> {
public abstract void run(E reference);
}
Est-il une interface standard pour cette fin ou je dois déclarer que, de base, un par moi-même?
source d'informationauteur mschayna
Vous devez vous connecter pour publier un commentaire.
En général, vous mettre en œuvre
Runnable
ouCallable
en tant que classe, qui a soutenu une genertic paramètre d'entrée; par exemple,Il est également
com.google.commun.de la base.Fonction<F, T>
deGoogle CollectionsGoyave.Si vous définissez le type de sortie à
?
ouVoid
(et l'avoir toujours revenirnull
), vous pouvez l'utiliser comme une alternative àRunnable
avec un paramètre d'entrée.Cela a l'avantage d'être en mesure d'utiliser
Functions.compose
pour transformer la valeur d'entrée,Iterables.transform
à appliquer à chaque élément d'une collection etc.Java 8 comprend les
java.util.fonction.Consommation<T>
interface avec le seul non-méthode par défautvoid accept(T t)
.Il existe de nombreuses autres interfaces dans ce package.
En général, si vous voulez passer un paramètre dans le
run()
méthode, vous aurez la sous-classeRunnable
avec un constructeur qui prend un paramètre.Par exemple, Vous voulez faire:
Vous avez besoin pour ce faire:
Vous permettra de mettre en œuvre
YourRunnable
similaire à ci-dessous:Je suggère de définir une interface comme le fait dans la question d'origine. En outre, éviter de typage faible par rendre l'interface spécifique pour ce qu'il est censé faire, plutôt que d'un sens sans interface comme
Runnable
.Exécutable n'est pas destiné à être appelé directement par le code du client comme
foo.run()
qui seraient exécutées de manière séquentielle dans le thread courant.De la Praticable API:
Au lieu de cela, vous créez un nouveau Thread instance en fonction de votre exécutable, et ensuite appeler
bar.start()
. C'est alors la JVM de la responsabilité de faire appelrun()
dans ce thread séparé.Exemple: