Maison >Java >javaDidacticiel >Comment résoudre l'exception d'erreur rejetée par l'appel de méthode Java (MethodInvocationRejectedErrorExceotion)

Comment résoudre l'exception d'erreur rejetée par l'appel de méthode Java (MethodInvocationRejectedErrorExceotion)

WBOY
WBOYoriginal
2023-08-19 20:37:49986parcourir

Comment résoudre lexception derreur rejetée par lappel de méthode Java (MethodInvocationRejectedErrorExceotion)

Comment résoudre l'exception d'erreur rejetée par l'invocation de méthode Java (MethodInvocationRejectedErrorExceotion)

Introduction :
Dans la programmation Java, lorsque nous utilisons le multithreading ou un pool de threads pour effectuer des appels de méthode, nous pouvons parfois rencontrer des erreurs d'appel de méthode rejetées Exception (MethodInvocationRejectedErrorExceotion ). Cette exception empêche le thread d'exécuter correctement la méthode et peut entraîner l'arrêt du programme. Cet article décrit comment résoudre cette exception et fournit des exemples de code correspondants.

Raison de l'exception :
L'exception d'erreur d'appel de méthode rejetée est généralement causée par des limitations de ressources du pool de threads. Lorsque le nombre de threads dans le pool de threads atteint la limite maximale et qu'une nouvelle demande d'appel de méthode arrive, le pool de threads refusera d'appeler la méthode et lèvera une exception.

Solution :
Voici plusieurs solutions, vous pouvez choisir la solution qui vous convient en fonction de la situation spécifique.

  1. Augmenter la capacité du pool de threads :
    Cette exception peut être résolue en augmentant le nombre maximum de threads dans le pool de threads. Ceci peut être réalisé en modifiant le fichier de configuration du pool de threads ou en définissant les paramètres pertinents dans le code. Voici un exemple de code spécifique :
ExecutorService executor = Executors.newFixedThreadPool(10);   //创建一个固定大小为10的线程池
((ThreadPoolExecutor)executor).setMaximumPoolSize(20);   //增加最大线程数量为20
  1. Utilisez un pool de threads non bloquant :
    Vous pouvez utiliser un pool de threads non bloquant pour résoudre cette exception. Un pool de threads non bloquant renverra les tâches non traitées à l'appelant au lieu de lever une exception lorsque le nombre maximum de threads est atteint. Voici un exemple de code spécifique :
ThreadPoolExecutor executor = new ThreadPoolExecutor(
    10,  //核心线程数量
    20,  //最大线程数量
    60,  //线程保持活跃时间
    TimeUnit.SECONDS,  //活跃时间的单位
    new LinkedBlockingQueue<Runnable>(),  //任务队列
    new ThreadPoolExecutor.CallerRunsPolicy());  //非阻塞策略,将未处理的任务返回给调用方
  1. Utiliser une file d'attente limitée :
    Définissez la file d'attente des tâches du pool de threads sur une file d'attente limitée pour empêcher la file d'attente des tâches de croître à l'infini, empêchant le pool de threads d'accepter de nouvelles tâches. . Voici un exemple de code spécifique :
ThreadPoolExecutor executor = new ThreadPoolExecutor(
    10,  //核心线程数量
    20,  //最大线程数量
    60,  //线程保持活跃时间
    TimeUnit.SECONDS,  //活跃时间的单位
    new ArrayBlockingQueue<Runnable>(100));  //有界任务队列,最大容量为100
  1. Utilisation d'une politique de rejet :
    Vous pouvez gérer la situation lorsqu'un appel de méthode est rejeté en définissant une politique de rejet. La politique de rejet détermine la marche à suivre lorsque le pool de threads refuse d'accepter de nouvelles tâches. Ce qui suit est un exemple de code simple :
ThreadPoolExecutor executor = new ThreadPoolExecutor(
    10,  //核心线程数量
    20,  //最大线程数量
    60,  //线程保持活跃时间
    TimeUnit.SECONDS,  //活跃时间的单位
    new LinkedBlockingQueue<Runnable>(),  //任务队列
    new RejectedExecutionHandler() {   //自定义拒绝策略
        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            //执行自定义的处理逻辑,例如日志记录或抛出自定义异常
        }
    });

Résumé :
Lorsque nous rencontrons une exception d'erreur d'invocation de méthode Java rejetée (MethodInvocationRejectedErrorExceotion), nous pouvons augmenter la capacité du pool de threads, utiliser un pool de threads non bloquant, utiliser une file d'attente limitée ou définir Politique de refus pour résoudre l’exception. Choisir la solution appropriée en fonction de la situation spécifique peut garantir que le pool de threads peut gérer normalement toutes les demandes d'appel de méthode et améliorer la stabilité et la fiabilité du programme.

Référence :

  • Documentation du pool de threads Java : https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/util/concurrent/ThreadPoolExecutor.html
  • Java Tutoriel sur le pool de threads : https://www.baeldung.com/thread-pool-java-and-guava

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn