


Introduction détaillée à Callable et Future dans le multithreading Java (exemple de code)
Le contenu de cet article est une introduction détaillée (exemple de code) sur Callable et Future dans le multi-threading Java. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
La raison pour laquelle Callable et Future apparaissent
Il existe deux façons de créer un thread, l'une consiste à hériter directement de Thread et l'autre à implémenter l'interface Runnable .
Les deux méthodes ont un défaut : les résultats d'exécution ne peuvent pas être obtenus une fois la tâche exécutée.
Si vous avez besoin d'obtenir les résultats d'exécution, vous devez obtenir l'effet via des variables partagées ou une communication par thread, ce qui est plus difficile à utiliser.
Depuis Java 1.5, Callable et Future ont été fournis, grâce auxquels les résultats de l'exécution de la tâche peuvent être obtenus une fois l'exécution de la tâche terminée.
Introduction à Callable et Future
L'interface Callable représente un morceau de code qui peut être appelé et renvoie des résultats ; l'interface Future représente une tâche asynchrone, qui est la futur donné par la tâche qui n’est pas encore terminée. Ainsi, Callable est utilisé pour générer des résultats et Future est utilisé pour obtenir des résultats.
L'interface Callable utilise des génériques pour définir son type de retour. La classe Executors fournit des méthodes utiles pour exécuter des tâches dans le Callable dans le pool de threads. Puisque la tâche Callable est parallèle (parallèle signifie que tout semble parallèle, en fait, un seul thread s'exécute à un certain moment), nous devons attendre le résultat qu'elle renvoie.
L'objet java.util.concurrent.Future résout ce problème pour nous. Une fois que le pool de threads a soumis la tâche Callable, un objet Future est renvoyé. Vous pouvez l'utiliser pour connaître l'état de la tâche Callable et obtenir le résultat de l'exécution renvoyé par le Callable. Future fournit la méthode get() afin que nous puissions attendre la fin du Callable et obtenir ses résultats d'exécution.
Callable et Runnable
java.lang.Runnable, c'est une interface, et une seule méthode run() y est déclarée :
public interface Runnable { public abstract void run(); }
Étant donné que la valeur de retour de la méthode run() est de type void, aucun résultat ne peut être renvoyé une fois la tâche exécutée.
Callable se trouve sous le package java.util.concurrent C'est aussi une interface et n'y déclare qu'une seule méthode, mais cette méthode est appelée call() :
public interface Callable<V> { /** * Computes a result, or throws an exception if unable to do so. * * @return computed result * @throws Exception if unable to compute a result */ V call() throws Exception; }
Ceci. Il s'agit d'une interface générique et le type renvoyé par la fonction call() est le type V transmis.
Utilisation de Callable
Généralement, il est utilisé conjointement avec ExecutorService Plusieurs versions surchargées de la méthode submit sont déclarées dans l'interface ExecutorService.
<T> Future<T> submit(Callable<T> task); <T> Future<T> submit(Runnable task, T result); Future<?> submit(Runnable task);
Le type de paramètre dans la première méthode de soumission est Callable.
Pour le moment, il vous suffit de savoir que Callable est généralement utilisé en conjonction avec ExecutorService. La méthode d'utilisation spécifique sera décrite plus loin.
Généralement, nous utilisons la première méthode de soumission et la troisième méthode de soumission, et la deuxième méthode de soumission est rarement utilisée.
Future
Future consiste à annuler le résultat de l'exécution d'une tâche Runnable ou Callable spécifique, à demander si elle est terminée et à obtenir le résultat. Si nécessaire, vous pouvez obtenir le résultat de l'exécution via la méthode get, qui se bloquera jusqu'à ce que la tâche renvoie le résultat.
La classe Future se trouve sous le package java.util.concurrent. C'est une interface :
public interface Future<V> { boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException; V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
Il y a 5 méthodes déclarées dans l'interface Future. expliqué ci-dessous
La méthode d'annulation est utilisée pour annuler la tâche. Si l'annulation de la tâche réussit, elle renvoie true. Si l'annulation de la tâche échoue, elle renvoie false. Le paramètre mayInterruptIfRunning indique s'il est autorisé à annuler les tâches en cours d'exécution mais qui ne sont pas terminées. S'il est défini sur true, cela signifie que les tâches en cours d'exécution peuvent être annulées. Si la tâche est terminée, que mayInterruptIfRunning soit vrai ou faux, cette méthode renverra certainement false, c'est-à-dire que si la tâche terminée est annulée, elle renverra false si la tâche est en cours d'exécution, si mayInterruptIfRunning est défini sur true ; il retournera true, si mayInterruptIfRunning est défini sur false , puis retournera false ; si la tâche n'a pas été exécutée, alors que mayInterruptIfRunning soit true ou false, elle retournera certainement true.
La méthode isCancelled indique si la tâche est annulée avec succès. Si la tâche est annulée avec succès avant qu'elle ne soit terminée normalement, elle renvoie vrai. La méthode
isDone indique si la tâche est terminée. Si la tâche est terminée, elle renvoie vrai
la méthode get() est utilisée ; pour obtenir le résultat de l'exécution. Cette méthode bloquera et attendra que la tâche soit terminée avant de revenir
get(long timeout, TimeUnit unit) est utilisé pour obtenir le résultat de l'exécution. il n'a pas été obtenu dans le délai imparti. Lorsque le résultat est atteint, null est renvoyé directement.
Future propose trois fonctions :
pour déterminer si la tâche est terminée
pour ; pouvoir interrompre la tâche ;
-
peut obtenir les résultats de l'exécution de la tâche.
Parce que Future n'est qu'une interface, elle ne peut pas être utilisée directement pour créer des objets, il y a donc la FutureTask suivante.
FutureTask
FutureTask implémente l'interface RunnableFuture La définition de cette interface est la suivante :
public interface RunnableFuture<V> extends Runnable, Future<V> { void run(); }
Vous pouvez voir que cette interface implémente. Runnable et Future Interface, l'implémentation spécifique dans l'interface est implémentée par FutureTask. Les deux méthodes de construction de cette classe sont les suivantes :
public FutureTask(Callable<V> callable) { if (callable == null) throw new NullPointerException(); sync = new Sync(callable); } public FutureTask(Runnable runnable, V result) { sync = new Sync(Executors.callable(runnable, result)); }
如上提供了两个构造函数,一个以Callable为参数,另外一个以Runnable为参数。这些类之间的关联对于任务建模的办法非常灵活,允许你基于FutureTask的Runnable特性(因为它实现了Runnable接口),把任务写成Callable,然后封装进一个由执行者调度并在必要时可以取消的FutureTask。
FutureTask可以由执行者调度,这一点很关键。它对外提供的方法基本上就是Future和Runnable接口的组合:get()、cancel、isDone()、isCancelled()和run(),而run()方法通常都是由执行者调用,我们基本上不需要直接调用它。
FutureTask的例子
public class MyCallable implements Callable<String> { private long waitTime; public MyCallable(int timeInMillis){ this.waitTime=timeInMillis; } @Override public String call() throws Exception { Thread.sleep(waitTime); //return the thread name executing this callable task return Thread.currentThread().getName(); } }
public class FutureTaskExample { public static void main(String[] args) { MyCallable callable1 = new MyCallable(1000); // 要执行的任务 MyCallable callable2 = new MyCallable(2000); FutureTask<String> futureTask1 = new FutureTask<String>(callable1);// 将Callable写的任务封装到一个由执行者调度的FutureTask对象 FutureTask<String> futureTask2 = new FutureTask<String>(callable2); ExecutorService executor = Executors.newFixedThreadPool(2); // 创建线程池并返回ExecutorService实例 executor.execute(futureTask1); // 执行任务 executor.execute(futureTask2); while (true) { try { if(futureTask1.isDone() && futureTask2.isDone()){// 两个任务都完成 System.out.println("Done"); executor.shutdown(); // 关闭线程池和服务 return; } if(!futureTask1.isDone()){ // 任务1没有完成,会等待,直到任务完成 System.out.println("FutureTask1 output="+futureTask1.get()); } System.out.println("Waiting for FutureTask2 to complete"); String s = futureTask2.get(200L, TimeUnit.MILLISECONDS); if(s !=null){ System.out.println("FutureTask2 output="+s); } } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); }catch(TimeoutException e){ //do nothing } } } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

PHP et Python ont chacun leurs propres avantages, et le choix doit être basé sur les exigences du projet. 1.Php convient au développement Web, avec une syntaxe simple et une efficacité d'exécution élevée. 2. Python convient à la science des données et à l'apprentissage automatique, avec une syntaxe concise et des bibliothèques riches.

PHP est un langage de script largement utilisé du côté du serveur, particulièrement adapté au développement Web. 1.Php peut intégrer HTML, traiter les demandes et réponses HTTP et prend en charge une variété de bases de données. 2.PHP est utilisé pour générer du contenu Web dynamique, des données de formulaire de traitement, des bases de données d'accès, etc., avec un support communautaire solide et des ressources open source. 3. PHP est une langue interprétée, et le processus d'exécution comprend l'analyse lexicale, l'analyse grammaticale, la compilation et l'exécution. 4.PHP peut être combiné avec MySQL pour les applications avancées telles que les systèmes d'enregistrement des utilisateurs. 5. Lors du débogage de PHP, vous pouvez utiliser des fonctions telles que error_reportting () et var_dump (). 6. Optimiser le code PHP pour utiliser les mécanismes de mise en cache, optimiser les requêtes de base de données et utiliser des fonctions intégrées. 7

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.

Spring Boot simplifie la création d'applications Java robustes, évolutives et prêtes à la production, révolutionnant le développement de Java. Son approche "Convention sur la configuration", inhérente à l'écosystème de ressort, minimise la configuration manuelle, allo
