Rumah >Java >Bagaimana untuk mengendalikan multithreading dalam ``Executor Service``java

Bagaimana untuk mengendalikan multithreading dalam ``Executor Service``java

WBOY
WBOYke hadapan
2024-02-22 12:43:06627semak imbas

Editor PHP Youzi akan memberi anda jawapan: Menggunakan Perkhidmatan Pelaksana untuk mengendalikan berbilang benang dalam Java ialah cara yang cekap untuk menguruskan kumpulan benang dan kitaran hayat benang dengan berkesan. Melalui Perkhidmatan Pelaksana, anda boleh mencipta, memulakan dan mengawal berbilang utas dengan mudah untuk mencapai pelaksanaan tugas serentak dan meningkatkan kecekapan program. Artikel ini akan menyelidiki cara menggunakan Perkhidmatan Pelaksana untuk mengendalikan isu berbilang benang di Jawa, membantu anda memahami dan menggunakan alat pemprosesan berbilang benang yang penting ini.

Kandungan soalan

Saya sedang membangunkan penyelesaian, untuk pelanggan tunggal, saya perlu menghubungi api untuk mendapatkan senarai pekerja pelanggan tersebut. Tetapi api ini (pihak ketiga) hanya boleh memulangkan 100 pekerja pada satu-satu masa. Jadi saya perlu memanggil api yang sama dengan menukar offset setiap kali untuk mendapatkan set 100 pekerja seterusnya. Pada masa ini ini dikendalikan menggunakan satu benang, jadi masa untuk mendapatkan semua pekerja (katakan 30k) meningkat apabila bilangan pekerja meningkat. Dan apl itu mempunyai ramai pelanggan sedemikian.

Sebagai penyelesaian kepada masalah ini, saya cuba melaksanakan multi-threading menggunakan #executorservice. Dengan penyelesaian ini, masa yang diperlukan untuk mendapatkan semua pekerja untuk pelanggan dikurangkan.

Soalan:

  1. Bagaimanakah berbilang rangkaian (daripada berbilang pelanggan) berfungsi dengan perkhidmatan pelaksana yang mempunyai berbilang rangkaian untuk memanggil api?
  2. Adakah logik berikut dalam persekitaran berbilang benang menyebabkan pengguna akhir mendapat data yang salah? Kod contoh:
ExecutorService executor = Executors.newFixedThreadPool(2);

  ServiceExecutor executor0 = new ServiceExecutor("0");
  ServiceExecutor executor1 = new ServiceExecutor("100");

  Future result0 = executor.submit(executor0);
  Future result1 = executor.submit(executor1);
   
  List<String> s1 = new ArrayList<>();
  s1.add(result0.get());
  s2.add(result1.get());

Penyelesaian

Jawapan kepada soalan ini sebahagian besarnya bergantung pada cara permohonan anda disediakan untuk menerima permintaan daripada pelanggan anda. Adakah perkhidmatan pelaksana baharu dibuat untuk setiap permintaan yang masuk, atau adakah perkhidmatan pelaksana dikongsi antara semua permintaan? Mencipta perkhidmatan pelaksana baharu untuk setiap permintaan akan menjadi sangat membazir kerana anda perlu memperuntukkan ruang untuk utas baharu yang tidak akan wujud untuk masa yang lama. Oleh itu, adalah lebih cekap untuk menggunakan semula ExecutorService yang sama untuk berbilang permintaan.

Dalam kes ini, menggunakan Executors.newCachedThreadPool() 而不是 newFixedThreadPool() mungkin lebih fleksibel kerana ini membolehkan ExecutorService meningkatkan bilangan utas dalam kumpulan secara dinamik mengikut keperluan.

Atas ialah kandungan terperinci Bagaimana untuk mengendalikan multithreading dalam ``Executor Service``java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam