Apa yang saya kejar adalah cara yang kompatibel untuk mengkonfigurasi penggunaan kumpulan thread atau tidak. Idealnya, sisa kode tidak akan terpengaruh sama sekali. Saya bisa menggunakan kumpulan utas dengan 1 utas tetapi itu bukan yang saya inginkan. Ada ide?
ExecutorService es = threads == 0 ? new CurrentThreadExecutor() : Executors.newThreadPoolExecutor(threads);
// es.execute / es.submit / new ExecutorCompletionService(es) etc
java
concurrency
Michael Rutherfurd
sumber
sumber
AbstractExecutorService
sepertinya cara terbaik.Runnable::run
Anda dapat menggunakan Guava's
MoreExecutors.newDirectExecutorService()
, atauMoreExecutors.directExecutor()
jika Anda tidak membutuhkanExecutorService
.Jika memasukkan Jambu biji terlalu berat, Anda dapat menerapkan sesuatu yang hampir sama baiknya:
sumber
Gaya Java 8:
Executor e = Runnable::run;
sumber
Saya menulis
ExecutorService
berdasarkanAbstractExecutorService
.sumber
terminated
tidak akan mendapatkan keuntungan dari akses tersinkronisasi berdasarkan kode yang sebenarnya ada di sini. Operasi pada bidang 32-bit bersifat atomik di Java.Anda dapat menggunakan RejectedExecutionHandler untuk menjalankan tugas di utas saat ini.
Anda hanya perlu satu dari ini.
sumber
java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy
.Saya harus menggunakan "CurrentThreadExecutorService" yang sama untuk tujuan pengujian dan, meskipun semua solusi yang disarankan bagus (terutama yang menyebutkan cara Guava ), saya menemukan sesuatu yang mirip dengan apa yang disarankan Peter Lawrey di sini .
Seperti yang disebutkan oleh Axelle Ziegler di sini , sayangnya solusi Peter tidak benar-benar berfungsi karena cek yang dimasukkan
ThreadPoolExecutor
padamaximumPoolSize
parameter konstruktor (yaitumaximumPoolSize
tidak dapat<=0
).Untuk menghindari itu, saya melakukan hal berikut:
sumber