За последние два года работы в Android, изучая исходный код Android, я также буду иметь некоторое понимание параллельной обработки Java многопоточного.
Итак, вопрос в том, как реализовать пул последовательных потоков?
Что такое серийный бассейн?
Другими словами, наши запускаемые объекты должны иметь механизм очереди, который входит из хвоста очереди последовательно, и выбирает бегство из головки очереди для выполнения.
Поскольку у нас есть идея, давайте рассмотрим необходимую структуру данных?
Поскольку мы вставляем выполняемый объект из конца очереди и выполняем выполняемый объект из головы очереди, нам, естественно, нужна очередь. Java SDK предоставил нам хорошую структуру данных в очереди, такую как двойная очередь: Arraydeque <Runnable>.
import java.util.ArrayDequ;import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingDeque;import java.util.concurrent.ThreadFactory;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.atomicinteger;/*** Создано Wush 16-1-5. */public class serialexecutor {private Runnable Mactive; Частный arraydeque <lunnable> marraydeque = new ArrayDeque <> (); Private Static Final int cpu_count = runtime.getRuntime (). Доступный processors (); Private Static Final int core_pool_size = cpu_count + 1; Private Static Final int maximum_pool_size = cpu_count * 2 + 1; Частный статический конечный int heap_alive = 1; Private Static Final Blockqueue <Runnable> spoolworkqueue = new LinkedBlockingDeque <> (128); Private Static Final Threadfactory sthReadFactory = new ThreadFactory () {Private Final AtomicInteger mcount = new AtomicInteger (1); @Override public Thread newthread (Runnable r) {return new Thread (R, "Serial Thread #" + mcount.getandIncrement ()); }}; Private Static Final ThreadPoolexeCutor thread_executor = new ThreadPoolexeCutor (core_pool_size, maximum_pool_size, keep_alive, timeunit.seconds, spoolworkeue, sthreadfactory); Public Synchronized void Execute (Final Runnable R) {marrayDequ.offer (new Runnable () {@Override public void run () {try {r.run ();} наконец {shareLenext ();}}}); // Когда в первый раз, когда вы присоединяетесь к очереди, Mactive пуст, поэтому вам нужно вызвать метод PradeLenext вручную if (mactive == null) {shadulenext (); }} private void shadulenext () {if ((mactive = marraydequ.poll ())! = null) {threat_executor.execute (mactive); }} public static void main (string [] args) {serialexecutor serialexecutor = new serialexecutor (); for (int i = 0; i <10; i ++) {final int j = i; serialexecutor.execute (new Runnable () {@Override public void run () {system.out.println ("num is:" + (j + 1)); try {thread.sleep (1000);} catch (urruptedException e) {e.printStackTrace ();}}}); }}}Результаты выполнения следующие:
NUM: 1
NUM: 2
NUM: 3
NUM: 4
NUM: 5
NUM: 6
NUM: 7
NUM: 8
NUM: 9
NUM: 10
Выше приведено все содержание этой статьи об анализе экземпляров пула последовательных потоков, и я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!