Androidでの過去2年間で、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.threadpoolexutor; import java.util.current. java.util.concurrent.atomic.atomicinteger;/*** 16-1-5にWzyによって作成されました。 */public class serialexecutor {private runnable mactive; private arraydequ <runnable> marraydequ = new arraydequ <>(); Private static final int cpu_count = runtime.getRuntime()。利用可能なProcessors(); Private static final int core_pool_size = cpu_count + 1;プライベート静的最終int maximum_pool_size = cpu_count * 2 + 1;プライベート静的final int keep_alive = 1; private static final blockingqueue <runnable> spoolworkqueue = new linkedblockingdeque <>(128); private static final threadfactory sthreadfactory = new threadfactory(){private final atomicinteger mcount = new AtomicInteger(1); @OverrideパブリックスレッドnewThread(runnable r){return newスレッド(r、 "シリアルスレッド#" + mcount.getandincrement()); }}; private static final threadpoolexecutor thread_executor = new SthreadPoolexecutor(core_pool_size、maximing_pool_size、keep_alive、timeunit.seconds、spoolworkqueue、sthreadfactory); public synchronized void execute(final runnable r){marraydequ.offer(new runnable(){@override public void run(){try {r.run();} fullly {schedulenext();}}}); //キューに初めて参加したときに、Mactiveは空であるため、ScheduleNextメソッドを手動で呼び出す必要があります。 }} private void schedulenext(){if((mactive = marraydequ.poll())!= null){shood_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(interruptedexception e){e.printstacktrace();}}); }}}実行結果は次のとおりです。
numは次のとおりです
numは次のとおりです
numは次のとおりです
numは:4です
numは:5です
numは:6です
numは:7です
numは:8です
numは:9です
numは:10です
上記は、Javaの並行性のシリアルスレッドプールインスタンスの分析に関するこの記事のすべての内容であり、すべての人に役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!