1. Eksekutor
Kelas pelaksana dapat dianggap sebagai "kelas alat". Mengutip pengantar di JDK1.6 API:
Metode Pabrik dan Praktis dari Pelaksana, ExecutorService, Terjadwal ExecutorService, ThreadFactory, dan kelas -kelas yang dapat dipanggil yang ditentukan dalam paket ini. Kelas ini mendukung berbagai metode:
(1) Buat dan kembalikan metode pengaturan ExecutorService dengan string konfigurasi yang umum digunakan.
(2) Buat dan kembalikan metode pengaturan jadwal executorService dengan string konfigurasi yang umum digunakan.
(3) Buat dan kembalikan metode ExecutorService yang "dibungkus", yang menonaktifkan konfigurasi ulang dengan membuat metode spesifik implementasi tidak dapat diakses.
(4) Buat dan kembalikan metode ThreadFactory, yang dapat mengatur utas yang baru dibuat ke keadaan yang diketahui.
(5) Buat dan kembalikan metode yang tidak dapat dipanggil yang tidak tertutup, sehingga dapat digunakan dalam metode eksekusi yang memerlukan callable.
Melalui kelas ini, Anda dapat memperoleh beberapa contoh kumpulan utas, seperti menelepon NewsingLetHreadExecutor () untuk mendapatkan satu landasan utamanya, memanggil newfixedThreadpool () untuk mendapatkan layanan eksekutif dari kumpulan utas ukuran tetap, dll. Ada lebih banyak hal yang dapat Anda lakukan ketika Anda mendapatkan eksekutif layanan. Hal yang paling mudah adalah menggunakannya untuk menjalankan objek yang dapat dijalankan, atau Anda dapat menjalankan beberapa objek yang menerapkan <T> yang dapat dipanggil. Tidak ada nilai pengembalian menggunakan metode start () utas. Jika metode yang dijalankan oleh utas memiliki nilai pengembalian, akan lebih baik menggunakan ExecutorService. Anda dapat memilih Kirim (), Invokeall () atau InvokeAny () dan memilih metode yang sesuai sesuai dengan situasi tertentu.
Beberapa metode yang disediakan di kelas ini adalah:
1.1 Public Static ExecutorService newcachedthreadpool ()
Buat kumpulan utas yang membuat utas baru sesuai kebutuhan, tetapi akan menggunakannya kembali ketika utas yang dibangun sebelumnya tersedia. Kumpulan utas ini biasanya meningkatkan kinerja program untuk program yang melakukan banyak tugas asinkron jangka pendek.
1.2 Public Static ExecutorService newfixedthreadpool (int nthreads)
Buat kumpulan utas dengan sejumlah utas yang dapat digunakan kembali untuk menjalankan utas ini dalam antrian tak terbatas yang dibagikan.
1.3 Publik Statis ExecutorService NewsingLetHreadExecutor ()
Buat pelaksana yang menggunakan utas pekerja tunggal untuk menjalankan utas dalam antrian yang tidak terikat.
Ketiga metode tersebut dapat digunakan dengan contoh antarmuka threadFactory. Dan mengembalikan instance antarmuka ExecutorService.
2. Antarmuka ThreadFactory
Buat objek utas baru sesuai kebutuhan. Menggunakan pabrik utas tidak lagi memerlukan penulisan manual panggilan utas baru, memungkinkan aplikasi untuk menggunakan subkelas utas khusus, properti, dll.
Implementasi paling sederhana dari antarmuka ini adalah:
kelas SimpleThreadFactory mengimplementasikan threadFactory {utas publik newThread (runnable r) {return new thread (r); }} 3. Antarmuka ExecutorService
Antarmuka ini menyediakan metode untuk mengelola penghentian.
4. Buat utas startup kumpulan utas standar
4.1 Menyediakan utas sederhana yang mengimplementasikan antarmuka yang dapat dijalankan
Mythread.java
paket com.zj.concurrency.executors; kelas publik mythread mengimplementasikan runnable {private int count = 1, angka; public mythread (int num) {number = num; System.out.println ("Buat utas-" + angka); } public void run () {while (true) {System.out.println ("thread-" + number + "run" + count + "time (s)"); if (++ count == 3) kembali; }}} Utas ini akan mencetak informasi kreasi dan eksekusi yang sesuai.
4.2 Mulai utas menggunakan CachedThreadPool
CachedThreadpool.java
paket com.zj.concurrency.executors; import java.util.concurrent.executorservice; import java.util.concurrent.executors; Public Class CachedThreadPool {public static void main (string [] args) {executorService exec = executors.newcachedThreadPool (); untuk (int i = 0; i <5; i ++) exec.execute (mythread baru (i)); exec.shutdown (); }} hasil:
Buat thread-0create Thread-1create Thread-2Create Thread-3Thread-0 Run 1 Time (s) Thread-0 Run 2 Time (s) Thread-1 Run 1 Time (s) Thread-1 Run 2 Time (s) Thread-2 Run 1 Time (s) Thread-2 Run 2 Time (s) Buat thread-4thread-4 run 1 kali (s) Thread-4 run 2 Time (s) Thread-3 Thread-3
4.3 Mulai utas menggunakan fixedthreadpool
Fixedthreadpool.javapackage com.zj.concurrency.executors; impor java.util.concurrent.executorservice; impor java.util.concurrent.executors; kelas publik FixedThreadPool {public static void main (string [] args) {executorService exec = executors.newfixedThreadPool (2); untuk (int i = 0; i <5; i ++) exec.execute (mythread baru (i)); exec.shutdown (); }} hasil:
Buat thread-0create Thread-1create Thread-2Create Thread-3Create Thread-4Thread-0 Run 1 Time (s) Thread-0 Run 2 Time (s) Thread-2 Jalankan 1 Waktu (S) Thread-2 Jalankan 2 Waktu (S) Thread-3 Run 1 Time (s) Thread-3 Run 2 Time (s) Run 1 Time (s) Thread-3 Thread-3 Run 2 Time (s) Thread-3
4.4 Mulai utas menggunakan singlethreadexecutor
Singlethreadexecutor.java
paket com.zj.concurrency.executors; import java.util.concurrent.executorservice; import java.util.concurrent.executors; kelas publik singlethreadexecutor {public static void main (string [] args) {executorservice exec = executors.newsinglethreadexecutor (); untuk (int i = 0; i <5; i ++) exec.execute (mythread baru (i)); exec.shutdown (); }} hasil:
Buat thread-0create Thread-1create Thread-2Create Thread-3Create Thread-4Thread-0 Run 1 Time (s) Thread-0 Run 2 Time (s) Thread-1 Run 1 Time (s) Thread-1 Run 2 Time (s) Thread-2 Run-2 Time-2 Run-2 Run 2 Time (s) Run 1 Time (s) Thread-2 Run 2 Time (s) Thread-2 Run-5 Time (s) Thread-3 Run 1 Time (s) Thread-3 Run 2 Time (s) Thread-2 Run-3
5. Bekerja sama dengan penggunaan antarmuka ThreadFactory
Kami mencoba menambahkan pengaturan atribut daemon dan prioritas ke utas.
5.1 Atur properti utas latar belakang
Daemanthreadfactory.java
paket com.zj.concurrency.executors.factory; import java.util.concurrent.threadfactory; DaemanthreadFactory kelas publik mengimplementasikan threadFactory {utas publik newThread (runnable r) {thread t = utas baru (r); t.setdaemon (true); mengembalikan t; }}
5.2 Atur atribut prioritas
MAXPRIORITYTHREADFACTORY.JAVA
paket com.zj.concurrency.executors.factory; import java.util.concurrent.threadfactory; kelas publik maxPriorityThreadFactory mengimplementasikan threadFactory {thread publik newThread (runnable r) {thread t = thread baru (r); t.setPriority (thread.max_priority); mengembalikan t; }} Minimum PrioritasMinPriorityThreadFactory.java
paket com.zj.concurrency.executors.factory; import java.util.concurrent.threadfactory; kelas publik MinPriorityTreadFactory mengimplementasikan threadFactory {utas publik newThread (runnable r) {thread t = thread baru (r); t.setPriority (thread.min_priority); mengembalikan t; }}
5.3 Mulai utas dengan pengaturan atribut
ExecfromFactory.java
Paket com.zj.concurrency.Executors; import java.util.concurrent.executorservice; impor java.util.concurrent.executors; impor com.zj.concurrency.executors.factory.daemonThreadfactory; impor com.zj.concurrency.xecutors.execororyfactory; impor com.zj.concurrency com.zj.concurrency.executors.factory.minpriorityThreadFactory; Public Class ExecfromFactory {public static void main (string [] args) melempar Exception {ExecutorService defaultexec = executors.newcachedThreadPool (); ExecutorService Daemonexec = Executors .NewCachedThreadPool (DaemanthreadFactory ()); ExecutorService maxPriorityExec = Executors .NewCachedThreadPool (MAXPRIORITYTHREADFACTORY ()); ExecutorService MinPriorityExec = Executors .NewCachedThreadPool (MinPriorityThreadFactory () baru ()); untuk (int i = 0; i <10; i ++) daemonexec.execute (mythread baru (i)); untuk (int i = 10; i <20; i ++) if (i == 10) maxpriRiTityExec.execute (mythread baru (i)); lain jika (i == 11) minpriorityexec.execute (mythread baru (i)); lain defaultexec.execute (mythread baru (i)); }} hasil:
Buat thread-0create Thread-1create Thread-2Create Thread-3Thread-0 Run 1 Time (s) Thread-0 Run 2 Time (s) Thread-1 Run 1 Time (s) Thread-1 Run 2 Time (S) Thread-2 Run 1 Time (S) Thread-2 Run 2 Time (s) Buat Thread-4thread-4 run 1 Time (s) Thread-4 run 2 Time (s) create-thread-4 Thread-4 Run-4 Time (s) Thread-4 run 2 Time (s) Create-4 Thread-4th-4 Thread-6Create Thread-7Thread-7 Run 1 Time (s) Thread-7 Run 2 Time (s) Buat thread-8Thread-8 run 1 Time (s) Thread-8 Run 2 Time (s) Thread-9create Thread-10Thread-10 Run 1 Time (s) Thread-10 Run 2 Time (s) Buat utas-utas-11TRAAD-9 run 1 time (s) Thread-10 Thread-10 Run-6 Waktu (s) Thread-3 Run 1 Time (s) Thread-3 Run 2 Time (s) Buat thread-12Create Thread-13Create Thread-14Thread-12 Run 1 Time (s) Thread-12 Run 2 Time (s) Thread-13 Run 1 Time (S) Thread-15 Thread-5 Time-2 Time (S) Buat RUN-15THREAD-15 RUN-15 Time (s) Thread-15 run-15 Time 2 Time (S) RUN-5THREAD-15 RUN-15 RUN 1 kali (S) Thread-15 Run-15 Time-2 Time (S) THEHET-16 THREAD-16 Time-16 Run-15 Run-15 Timim Waktu (s) Buat thread-17Create Thread-18Create Thread-9Thread-14 Run 1 Time (s) Thread-14 Run 2 Time (s) Thread-17 Run 1 Time (s) Thread-17 Run 2 Time (s) Thread-18 Run-18 Time (s) Thread-18 Run 2 Time (s) Time (s) Time (s) Thread-18 run-9 run 2 Time (s) Thread-18 Thread-11 Run -1 (s) Thread-19 Time (s) Thread-19 run-9 run 2 Time (s) Thread-18 Thread-11