2016-11-06 1 views
0

Je viens de découvrir l'Executor de Java et je me demande si cela correspond à mes besoins. J'ai une base de données, à laquelle des tâches sont constamment ajoutées.Comment utiliser Executor quand il y a des milliers/nombre dynamique de tâches?

  1. I SQL SELECT toutes les lignes (tâches) de la base de données. À tout moment, il pourrait y avoir 100 000, 200, 3 ou 0 d'entre eux.

  2. Je vois tous les exemples sont comme ceci:

    ExecutorService taskExecutor = Executors.newFixedThreadPool(50); 
    while(...) { 
        taskExecutor.execute(new MyTask()); 
    } 
    

    Comment pourrait-il être ajusté à mon scénario? Je ne peux pas simplement instancier 100000 de MyTask, ça va gâcher une tonne de mémoire.

  3. Comment dois-je attendre pour terminer et vérifier à nouveau? Je ne peux pas attendre que 100 000 tâches soient terminées, parce que la première peut finir en 5 secondes et rester inutilisée pendant une longue période jusqu'à ce que la dernière soit finie, donc nous allons perdre du temps.

+0

Pourquoi interrogez-vous toutes les tâches de la base de données en même temps? Au lieu de cela, vous devriez juste interroger autant de tâches que vous avez la capacité de travailler (ce qui peut être seulement une) et ensuite interroger à nouveau une fois le travail terminé et vous avez plus de capacité. –

Répondre

2

Une manière élégante et efficace de le faire serait d'utiliser une mise en œuvre BoundedExecutor comme illustré dans le livre Java dans la pratique par Concurrency Brian Goetz (Github link here).

La mise en œuvre prévue sur le lien Github alors qu'un bon point de départ devrait également faire quelques changements

  1. Si vous souhaitez accéder aux valeurs de retour pour la tâche assurez vous que vos tâches à mettre en œuvre le Callable interface à la place de Runnable.
  2. En utilisant un ExecutorService au lieu d'un Executor serait plus bénéfique, car il nous aide à exposer plus de fonctionnalités d'arrêt granulaire .
  3. Expose un ensemble de méthodes qui permettent à l'exécuteur d'être arrêté par proprement. Ces implémentations d'appel d'arrêt peuvent simplement déléguer à le sous-jacent ExecutorService.shutdown() ou ExecutorService.shutdownNow() en fonction de l'exigence.

En outre, il serait bon de garder la limite en tant que paramètre de configuration - de cette façon lorsque l'exécuteur est initialisé borné le nombre de tâches qui peuvent être exécutées en toute sécurité en parallèle est lu ce paramètre de configuration.

Ce paramètre de configuration peut être ajusté en fonction de vos tests de performance et d'échelle pour identifier la limite optimale pour votre application sans dégrader ses performances ou les performances du système sous-jacent.

Espérons que cela aide.