Dalam dua tahun terakhir bekerja di Android, melalui meneliti kode sumber Android, saya juga akan memiliki beberapa pemahaman tentang pemrosesan multi-threading secara bersamaan Java.
Jadi pertanyaannya adalah, bagaimana menerapkan kumpulan utas serial?
Apa itu Serial Thread Pool?
Dengan kata lain, objek kami yang dapat dijalankan harus memiliki mekanisme antrian, yang masuk dari ekor antrian secara berurutan, dan memilih runnable dari kepala antrian untuk dieksekusi.
Karena kita punya ide, mari kita pertimbangkan struktur data yang diperlukan?
Karena kami memasukkan objek yang dapat dijalankan dari ujung antrian dan mengeksekusi objek yang dapat dijalankan dari kepala antrian, kami secara alami membutuhkan antrian. SDK Java telah memberi kami struktur data antrian yang baik, seperti antrian ganda: ArrayDeque <Runnable>.
impor java.util.arraydequ; impor java.util.concurrent.blockingqueue; impor java.util.concurrent.linkedblockingdeque; java.util.concurrent.atomic.atomicinteger;/*** Dibuat oleh WZY pada 16-1-5. */SerialExecutor kelas publik {private runnable mactive; Private ArrayDeque <Runnable> marraydequ = arrayDequent new <> (); private static final int cpu_count = runtime.getRuntime (). Tersedia Processors (); private static int int core_pool_size = cpu_count + 1; private static final int maximum_pool_size = cpu_count * 2 + 1; private static final int keep_alive = 1; BlockingQueue final statis pribadi <Runnable> spoolworkqueue = new LinkedBlockingDeque <> (128); private static final threadFactory sthreadfactory = new threadFactory () {private final atomicinteger mcount = atomicinteger baru (1); @Override Public Thread newThread (runnable r) {return thread baru (r, "Serial Thread #" + Mcount.getAndIncrement ()); }}; Private Static ThreadPoolExecutor thread_executor = new ThreadPoolExecutor (core_pool_size, maximum_pool_size, Keep_alive, timeunit.seconds, spoolworkqueue, sthreadfactory); EXECUTE VOID Sinkronisasi Publik (Final Runnable R) {MarrayDeque.offer (runnable baru () {@Override public void run () {try {r.run ();} akhirnya {scheduleNext ();}}}); // Ketika pertama kali Anda bergabung dengan antrian, mactive kosong, jadi Anda perlu menghubungi metode scheduleNext secara manual jika (mActive == null) {scheduleNext (); }} private void scheduleNext () {if ((mactive = marraydequ.poll ())! = null) {thread_executor.execute (mactive); }} public static void main (string [] args) {serialexecutor serialexecutor = new SerialExecutor (); untuk (int i = 0; i <10; i ++) {final int j = i; SerialExecutor.Execute (runnable baru () {@Override public void run () {System.out.println ("Num adalah:" + (j + 1)); coba {thread.sleep (1000);}}}}}} {E.printtack (); }}}Hasil eksekusi adalah sebagai berikut:
Numnya adalah: 1
Numnya adalah: 2
Jumlahnya adalah: 3
Jumlahnya adalah: 4
Numnya adalah: 5
Jumlahnya adalah: 6
Numnya adalah: 7
Jumlahnya adalah: 8
Jumlahnya adalah: 9
NUM adalah: 10
Di atas adalah semua konten dari artikel ini tentang analisis instance Serial Thread Pool dari Java Concurrency, dan saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!