Tampaknya mustahil untuk membuat kumpulan thread dalam cache dengan batasan jumlah thread yang dapat dibuat.
Berikut adalah bagaimana static Executors.newCachedThreadPool diimplementasikan di perpustakaan Java standar:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
Jadi, gunakan templat itu untuk terus membuat kumpulan utas cache berukuran tetap:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>());
Sekarang jika Anda menggunakan ini dan mengirimkan 3 tugas, semuanya akan baik-baik saja. Menyerahkan tugas lebih lanjut akan menghasilkan pengecualian eksekusi yang ditolak.
Mencoba ini:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>());
Akan menghasilkan semua utas mengeksekusi berurutan. Yaitu, kumpulan utas tidak akan pernah membuat lebih dari satu utas untuk menangani tugas Anda.
Ini adalah bug dalam metode eksekusi ThreadPoolExecutor? Atau mungkin ini disengaja? Atau ada cara lain?
Sunting: Saya ingin sesuatu persis seperti kumpulan thread yang di-cache (membuat thread berdasarkan permintaan dan kemudian membunuhnya setelah beberapa waktu habis) tetapi dengan batas jumlah thread yang dapat dibuat dan kemampuan untuk terus mengantre tugas-tugas tambahan setelah memiliki tekan batas utasnya. Menurut tanggapan Sjlee, ini tidak mungkin. Melihat metode execute () dari ThreadPoolExecutor memang tidak mungkin. Saya perlu subclass ThreadPoolExecutor dan menimpa mengeksekusi () agak seperti SwingWorker tidak, tetapi apa yang dilakukan SwingWorker dalam mengeksekusi () adalah hack lengkap.