1 alasan untuk memperkenalkan kumpulan utas
Karena siklus hidup utas mencakup kreasi, siap, berjalan, memblokir, dan menghancurkan tahap, ketika jumlah tugas yang kita simpan kecil, kita dapat membuat beberapa utas sendiri untuk menangani tugas yang sesuai, tetapi ketika ada sejumlah besar tugas, membuat dan menghancurkan utas membutuhkan banyak overhead, dan menggunakan kumpulan benang akan sangat mengurangi masalah ini.
2 Penggunaan kumpulan benang
Kami hanya perlu menggunakan metode statis yang disediakan oleh kelas pelaksana untuk membuat kumpulan utas yang sesuai:
Public Static ExecutorSevice NewsinglethreadExecutor () Public Static ExecutorSeVice newfixedThreadPool () Public Static ExecutorSeVice Newcachedthre Adpool ()
NewsLetHreadExecutor mengembalikan seorang pelaksana yang berisi satu utas.
NewfixedThreadPool Mengembalikan kumpulan utas yang berisi sejumlah utas yang ditentukan.
NewCachedThreadPool membuat utas yang sesuai berdasarkan jumlah tugas pengguna.
Kita hanya perlu memasukkan tugas untuk dieksekusi ke dalam metode run, dan menyerahkan kelas implementasi antarmuka runnable ke metode pelaksanaan kumpulan utas sebagai parameter, seperti yang ditunjukkan di bawah ini:
Executor Executor = Executors.NewsingLetHreadExecutor (); Executor.execute (runnable baru () {public void run () {// Tugas yang dieksekusi}}Jika Anda perlu meneruskan parameter ke tugas tersebut, Anda dapat melakukannya dengan membuat kelas implementasi untuk antarmuka yang dapat dilalui.
3. Contoh
(1): NewsingletHreadExecutor
Mythread.java
PublicClassMyThread memperluas utas {@Override publicVoid run () {System.out.println (thread.currentThread (). getName () + "Eksekusi ..."); {// Buat kumpulan utas yang dapat menggunakan kembali jumlah utas ExecutorService Pool = Executors. Thread T2 = MyThread baru (); Pool.execu TE (T2); Hasil output
Pool-1-Thread-1 mengeksekusi. . . Pool-1-Thread-1 mengeksekusi. . . Pool-1-Thread-1 mengeksekusi. . . Pool-1-Thread-1 mengeksekusi. . . Pool-1-Thread-1 mengeksekusi. . .
(2): newfixedthreadpool
Testfixedthreadpool.java
PublicClass testfixedThreadPool {publicstaticvoid main (string [] args) {// Buat kumpulan utas yang dapat menggunakan kembali jumlah tetap dari executorService pool = executors.newfixedThreadpo ol (2); Runnable Interface Thread T1 = MyThread (); Pool Execute Pool.Execute (T1); }} Hasil output
Pool-1-Thread-1 mengeksekusi. . . Pool-1-Thread-2 mengeksekusi. . . Pool-1-Thread-1 mengeksekusi. . . Pool-1-Thread-2 mengeksekusi. . . Pool-1-Thread-1 mengeksekusi. . .
(3): newcachedthreadpool
TestCachedThreadpool.java
PublicClass TestCachedThreadPool {publicstaticvoid main (string [] args) {// Buat kumpulan utas yang dapat menggunakan kembali jumlah utas ExecutorService pool = Executors.NewCachedThread pool (); Runnable Interface Thread T1 = MyThread (); Eksekusi di Pool.Execute (T1); } Hasil output:
Pool-1-Thread-2 mengeksekusi. . . Pool-1-Thread-4 mengeksekusi. . . Pool-1-Thread-3 mengeksekusi. . . Pool-1-Thread-1 mengeksekusi. . . Pool-1-Thread-5 sedang dieksekusi. . .
(4): NewsCheduledThreadPool
TestsCheduledThreadPoolExecutor.java
TestClass PublicsCheduledThreadPoolExecutor {publicstaticvoid main (string [] args) {scheduledThreadPoolExecutor exec = new DatededThreadPoolExecut Tor (1); Lempar RunimeException baru (); ==================================================== =========== runna ble () {// Cetak waktu sistem sesekali, membuktikan bahwa keduanya tidak memiliki pengaruh satu sama lain @Override publicVoid run () {System.out.println (System.nanoTime ()); Hasil output
==================================================== ==================================================== ==================================================== ==================================================== ==================================================== =====