Introduction à l'interface et au type de TaskExecutor
一 Interface TaskExecutor
L'interface TaskExecutor de Spring est équivalente à l'interface Java.util.concurrent.Executor. En fait, la principale raison de son existence est d’abstraire la dépendance à Java 5 lors de l’utilisation de pools de threads. Cette interface n'a qu'une seule méthode execute(Runnable task), qui accepte une tâche d'exécution selon la sémantique et la configuration du pool de threads.
TaskExecutor a été créé à l'origine pour fournir une abstraction de pool de threads à d'autres composants Spring en cas de besoin. Par exemple, le composant ApplicationEventMulticaster, AbstractMessageListenerContainer de JMS et l'intégration de Quartz utilisent tous l'abstraction TaskExecutor pour fournir un pool de threads. Bien entendu, vous pouvez également utiliser cette couche d'abstraction si vos beans nécessitent un comportement de pool de threads.
2 Type TaskExecutor
Il existe certaines implémentations de TaskExecutor prédéfinies dans le package de distribution Spring. Avec eux, vous n’avez même plus besoin de le mettre en œuvre vous-même.
Classe SimpleAsyncTaskExecutor
Cette implémentation ne réutilise aucun thread ou démarre un nouveau thread à chaque fois qu'elle est appelée. Cependant, il prend toujours en charge la définition d'une limite sur le nombre total de threads simultanés. Lorsque la limite sur le nombre total de threads simultanés est dépassée, les nouveaux appels seront bloqués jusqu'à ce qu'une position soit libérée. Si vous avez besoin d’une vraie piscine, lisez la suite.
Classe SyncTaskExecutor
Cette implémentation ne s'exécutera pas de manière asynchrone. Au lieu de cela, chaque appel est exécuté dans le thread à l’origine de l’appel. Son utilisation principale est lorsque le multithreading n'est pas requis, comme dans les cas de test simples.
Classe ConcurrentTaskExecutor
Cette implémentation est un wrapper pour la classe Java 5 java.util.concurrent.Executor. Il existe une autre alternative, la classe ThreadPoolTaskExecutor, qui expose les paramètres de configuration de l'Executor en tant que propriétés du bean. Il est rarement nécessaire d'utiliser ConcurrentTaskExecutor, mais si ThreadPoolTaskExecutor ne suffit pas, ConcurrentTaskExecutor est une autre alternative.
Classe SimpleThreadPoolTaskExecutor
Cette implémentation est en fait une sous-classe de la classe SimpleThreadPool de Quartz, qui écoute les rappels du cycle de vie de Spring. Il s'agit de son utilisation typique lorsque vous disposez d'un pool de threads qui doit être partagé entre des composants Quartz et non-Quartz.
Classe ThreadPoolTaskExecutor
Elle ne prend en charge aucun remplacement ou downport du package java.util.concurrent. Les implémentations de java.util.concurrent par Doug Lea et Dawid Kurzyniec utilisent des structures de packages différentes, ce qui les empêche de fonctionner correctement.
Cette implémentation ne peut être utilisée que dans l'environnement Java 5, mais c'est la plus couramment utilisée dans cet environnement. Les propriétés du bean qu'il expose peuvent être utilisées pour configurer un java.util.concurrent.ThreadPoolExecutor et l'envelopper dans un TaskExecutor. Si vous avez besoin d'une classe plus avancée, telle que ScheduledThreadPoolExecutor, nous vous recommandons d'utiliser plutôt ConcurrentTaskExecutor.
Classe TimerTaskExecutor
Cette implémentation utilise une TimerTask comme implémentation derrière elle. La différence entre celui-ci et SyncTaskExecutor est que l'appel de méthode est effectué dans un thread distinct, bien qu'il soit synchronisé dans ce thread.
Classe WorkManagerTaskExecutor
CommonJ est un ensemble de spécifications développées conjointement par BEA et IBM. Ces spécifications ne sont pas des normes Java ee, mais ce sont des normes communes pour les implémentations de serveurs d'applications BEA et IBM
Cette implémentation utilise CommonJ WorkManager comme implémentation sous-jacente et est la plus importante pour configurer les applications CommonJ WorkManager dans la classe de contexte Spring. . Semblable à SimpleThreadPoolTaskExecutor, cette classe implémente l'interface WorkManager, elle peut donc être utilisée directement comme WorkManager.
Trois exemples simples de TaskExcutor
1 taskExcutor


package com.test;import org.springframework.core.task.TaskExecutor;public class MainExecutor { private TaskExecutor taskExecutor; public MainExecutor (TaskExecutor taskExecutor) { this.taskExecutor = taskExecutor; } public void printMessages() { for(int i = 0; i < 25; i++) { taskExecutor.execute(new MessagePrinterTask("Message" + i)); } } private class MessagePrinterTask implements Runnable { private String message; public MessagePrinterTask(String message) { this.message = message; } public void run() { System.out.println(message); } } }
2 principaux


package com.test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TaskTest {//本地测试,不用部署到tomcatpublic static void main(String[] args) { System.out.println("测试任务调度开始..."); ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml"); MainExecutor te = (MainExecutor)appContext.getBean("taskExecutorExample"); te.printMessages(); System.out.println("--------"); } }
3.applicationContext.xml配置


<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "/spring-beans.dtd"><beans> <bean id="taskExecutorExample" class="com.test.MainExecutor"> <constructor-arg ref="taskExecutor" /> </bean> <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <property name="corePoolSize" value="5" /> <property name="maxPoolSize" value="10" /> <property name="queueCapacity" value="25" /> </bean></beans>
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

Support Vector Machine (SVM) en Python est un puissant algorithme d'apprentissage supervisé qui peut être utilisé pour résoudre des problèmes de classification et de régression. SVM fonctionne bien lorsqu'il s'agit de données de grande dimension et de problèmes non linéaires, et est largement utilisé dans l'exploration de données, la classification d'images, la classification de textes, la bioinformatique et d'autres domaines. Dans cet article, nous présenterons un exemple d'utilisation de SVM pour la classification en Python. Nous utiliserons le modèle SVM de la bibliothèque scikit-learn

Alors que la nouvelle génération de frameworks front-end continue d'émerger, VUE3 est apprécié comme un framework front-end rapide, flexible et facile à utiliser. Ensuite, apprenons les bases de VUE3 et créons un simple lecteur vidéo. 1. Installez VUE3 Tout d'abord, nous devons installer VUE3 localement. Ouvrez l'outil de ligne de commande et exécutez la commande suivante : npminstallvue@next. Ensuite, créez un nouveau fichier HTML et introduisez VUE3 : <!doctypehtml>

Golang est un langage de programmation puissant et efficace qui peut être utilisé pour développer diverses applications et services. Dans Golang, les pointeurs sont un concept très important, qui peut nous aider à exploiter les données de manière plus flexible et plus efficace. La conversion de pointeur fait référence au processus d'opérations de pointeur entre différents types. Cet article utilisera des exemples spécifiques pour découvrir les meilleures pratiques de conversion de pointeur dans Golang. 1. Concepts de base Dans Golang, chaque variable a une adresse, et l'adresse est l'emplacement de la variable en mémoire.

Avec le développement rapide d’Internet, les données sont devenues l’une des ressources les plus importantes à l’ère de l’information d’aujourd’hui. En tant que technologie qui obtient et traite automatiquement les données du réseau, les robots d'exploration Web attirent de plus en plus d'attention et d'applications. Cet article explique comment utiliser PHP pour développer un robot d'exploration Web simple et réaliser la fonction d'obtention automatique de données réseau. 1. Présentation de Web Crawler Le robot d'exploration Web est une technologie qui obtient et traite automatiquement les ressources réseau. Son principal processus de travail consiste à simuler le comportement du navigateur, à accéder automatiquement aux adresses URL spécifiées et à extraire toutes les informations.

VAE est un modèle génératif, son nom complet est VariationalAutoencoder, qui se traduit en chinois par auto-encodeur variationnel. Il s'agit d'un algorithme d'apprentissage non supervisé qui peut être utilisé pour générer de nouvelles données, telles que des images, de l'audio, du texte, etc. Comparés aux auto-encodeurs ordinaires, les VAE sont plus flexibles et plus puissants et peuvent générer des données plus complexes et plus réalistes. Python est l'un des langages de programmation les plus utilisés et l'un des principaux outils d'apprentissage en profondeur. En Python, il existe de nombreux excellents outils d'apprentissage automatique et profonds.

La relation entre le nombre d'instances Oracle et les performances de la base de données La base de données Oracle est l'un des systèmes de gestion de bases de données relationnelles les plus connus du secteur et est largement utilisée dans le stockage et la gestion de données au niveau de l'entreprise. Dans la base de données Oracle, l'instance est un concept très important. L'instance fait référence à l'environnement d'exécution de la base de données Oracle en mémoire. Chaque instance possède une structure de mémoire et un processus d'arrière-plan indépendants, qui sont utilisés pour traiter les demandes des utilisateurs et gérer les opérations de la base de données. Le nombre d'instances a un impact important sur les performances et la stabilité de la base de données Oracle.

Avec la popularité d'Internet, les codes de vérification sont devenus un processus nécessaire pour la connexion, l'enregistrement, la récupération du mot de passe et d'autres opérations. Dans le framework Gin, implémenter la fonction de code de vérification est devenu extrêmement simple. Cet article expliquera comment utiliser une bibliothèque tierce pour implémenter la fonction de code de vérification dans le framework Gin et fournira un exemple de code pour référence aux lecteurs. 1. Installer les bibliothèques dépendantes Avant d'utiliser le code de vérification, nous devons installer une bibliothèque tierce goCaptcha. Pour installer goCaptcha, vous pouvez utiliser la commande goget : $goget-ugithub

Generative Adversarial Networks (GAN, Generative Adversarial Networks) est un algorithme d'apprentissage en profondeur qui génère de nouvelles données via deux réseaux de neurones en compétition. GAN est largement utilisé pour les tâches de génération dans les domaines de l'image, de l'audio, du texte et d'autres domaines. Dans cet article, nous utiliserons Python pour écrire un exemple d'algorithme GAN permettant de générer des images de chiffres manuscrits. Préparation de l'ensemble de données Nous utiliserons l'ensemble de données MNIST comme ensemble de données de formation. L'ensemble de données MNIST contient
