Cum să rulați mai multe fire simultan în Java? Abordarea ExecutorService

Publicat: 2021-10-09
Cum să rulați mai multe fire simultan în Java? Abordarea ExecutorService

Să aruncăm o privire din nou la acest exemplu: Cum să obțineți starea Ping a oricărui punct final HTTP în Java?

Ați observat execuția firului pentru acel exemplu? Este secvenţial. What if you have 500 endpoints? Pun pariu că trebuie să așteptați cel puțin 5 minute pentru a obține rezultat. Ceea ce sunt sigur că nu este cea mai bună soluție.

Acum ce? Întrebarea corectă ar fi:

  • Cum să rulezi mai multe fire simultan?
  • Cum se implementează mai multe fire în Java?
  • Cum rulez fire diferite în Java?
  • Java – Unde este Tutorialul de programare multithreading?
  • Thread: Cum să utilizați mai multe fire pentru a accelera procesarea?

ExecutorService Approach este răspunsul tău.

Un Executor care oferă metode de gestionare a rezilierii și metode care pot produce un viitor pentru urmărirea progresului uneia sau mai multor sarcini asincrone.

Un ExecutorService poate fi oprit, ceea ce îl va determina să respingă noi sarcini. Sunt furnizate două metode diferite pentru închiderea unui ExecutorService. Metoda shutdown() va permite executarea sarcinilor trimise anterior înainte de terminare, în timp ce metoda shutdownNow() împiedică pornirea sarcinilor în așteptare și încercările de a opri executarea sarcinilor curente.

La reziliere, un executor nu are sarcini în execuție activă, nicio sarcină în așteptare de executare și nicio sarcină nouă nu poate fi depusă. Un ExecutorService neutilizat ar trebui să fie închis pentru a permite recuperarea resurselor sale.

Metoda de trimitere extinde metoda de bază Executor.execute ( java.lang.Runnable ) prin crearea și returnarea unui viitor care poate fi folosit pentru a anula execuția și/sau a aștepta finalizarea. Metodele invokeAny și invokeAll efectuează cele mai frecvente forme utile de execuție în bloc, executând o colecție de sarcini și apoi așteptând ca cel puțin una sau toate să fie finalizate. (Class ExecutorCompletionService poate fi folosit pentru a scrie variante personalizate ale acestor metode.)

Clasa Executors oferă metode din fabrică pentru serviciile de executor furnizate în acest pachet.

  • java – ExecutorService, cum să așteptați ca toate sarcinile să se termine?
  • Un ghid pentru Java ExecutorService
  • Java Thread Pool – Explicație ExecutorService

Mai jos este un exemplu Java simplu care explică usage of ExecutorService .

Ieșire:

Acum verificați rezultatul.

Ar trebui să fie în doar câteva secunde. Sper că veți găsi acest lucru de ajutor. Încercați să rulați acest lucru de mai multe ori și este posibil să vedeți un rezultat diferit, deoarece toate firele de execuție se execută în paralel, iar cine obține vreodată un rezultat rapid, va vedea rezultatul postat în consola Eclipse.

Anunță-mă pentru orice întrebare.