この例では、参照用のJava手書きスレッドプールの実装コードを共有しています。特定のコンテンツは次のとおりです
1。スレッドプールは、マルチスレッドの形式です。処理中、キューにタスクが追加され、スレッドが作成された後にこれらのタスクが自動的に開始されます。スレッドプールスレッドはすべてバックグラウンドスレッドです。
2。シンプルなスレッドプールアーキテクチャ
3。シンプルなスレッドプールコード(自己最適化)
Java.util.list;/** *スレッドインターフェイス * * @author yjian * @date 14:49 2017/10/14 **/public interface ithreadpool {//タスクvoid execute(runnableタスク); //タスクvoid execute(runnable []タスク); //タスクvoid execute(list <Runnable>タスク)を追加します。 //スレッドvoid Destroy();}を破壊するjava.util.linkedlist; Import java.util.list; Import java.util.current.atomic.atomiclong;/** *スレッド実装クラス(単純な実装、自己最適化。アイデアを提供します。 ithreadpool {//スレッドの数はデフォルトで有効になりますstatic int worker_number = 5; //完了したスレッドの数は静的揮発性int sumcount = 0です。 //タスクキューリストはスレッドセーフではなく、スタティックリスト<runnable> taskqueue = new linkedlist <runnable>()をブロックするように最適化できます。 //スレッドワークグループWorkerThread [] workthreads; // Atomic Static Atomiclong Threadnum = new AtomicLong();静的ThreadPoolimplスレッドプール。 //構築方法public threadpoolimpl(){this(worker_number); } public threadpoolimpl(int workernum){this.worker_number = workernum; //ワーカースレッドスペースworkthreads = new WorkerThread [worker_number]; //(int i = 0; i <Worker_number; i ++){workthreads [i] = new WorkerThread();スレッドスレッド= new Thread(workthreads [i]、 "threadpool-worker" + threadnum.incrementAndget()); system.out.println( "スレッドの初期化" +(i + 1) + "----------現在のスレッド名:" + thread.getName()); thread.start(); }} @Override public String toString(){return "ワーカースレッドの数は" + worker_number + "完了したタスクの数 +" sumcount + "待機タスクの数" + taskqueue.size(); } //スレッドプールを取得するpublic static ithreadpool getthreadpool(){return getthreadpool(worker_number); } public static ithreadpool getthreadpool(int workernum){//断層トレランス、0以下の場合、スレッドのデフォルト数は(workernum <= 0){workernum = worker_number; } if(threadpool == null){threadpool = new StreadPoolimpl(workernum); } return threadpool; } @Override public void execute(runnable task){synchronized(taskqueue){taskqueue.add(task); taskqueue.notifyall(); }} @Override public void execute(runnable [] tasks){synchronized(taskqueue){for(runnable task:tasks){taskqueue.add(task); } taskqueue.notifyall(); }} @Override public void execute(list <runnable> tasks){synchronized(taskqueue){for(runnable task:tasks){taskqueue.add(task); } taskqueue.notifyall(); }} @Override public void Destroy(){//ここで、ここで、ループにまだ存在します。 } catch(arturnedexception e){e.printstacktrace(); }} //タスクキューが処理されている場合、スレッドを破壊し、タスクをクリアします(int i = 0; i <Worker_number; i ++){workthreads [i] .setworkerflag(); workthreads [i] = null; } threadpool = null; taskqueue.clear(); } //ワーカースレッドを作成するプールクラスWorkerThread extendsスレッド{//現在のスレッドを識別するために使用します。 @Override public void run(){runnable runnable = null; // while(isrunning){//非thread-safe、so synchronized(taskqueue){while(isrunning && taskqueue.isempty()){try {//タスクキューが空の場合は、20ミリ秒のリスニングタスクを待ってtaskqueue.wait(20); } catch(Exception e){e.printstacktrace(); }} //タスクキューは空ではありませんif(!taskqueue.isempty()){runnable = taskqueue.remove(0); //最初のタスクを取得}} if(runnable!= null){runnable.run(); } sumcount ++; runnable = null; }} //スレッドを破壊しますpublic void setworkerflag(){isrunning = false; }}} java.util.arraylist;インポートJava.util.list;/** * test class * * @author yjian * @date 15:37 2017/10/14 **/public class threadpooltest {public static void main(string [] args){//スレッドプールを取得します。リスト<Runnable> taskList = new ArrayList <Runnable>(); for(int i = 0; i <100; i ++){tasklist.add(new Task()); } //タスクT.Execute(TaskList);を実行します。 System.out.println(t); //スレッドT.Destroy()を破壊します。 System.out.println(t); }静的クラスタスク実装runnable {private static volatile int i = 1; @Override public void run(){system.out.println( "現在処理されたスレッド:" + thread.currentthread()。 }}}Springソースコードを調査した後、コードで使用されるスプリングパターンが使用されるスプリングを慎重に確認します。プログラムを作成するための仕様は、春と同じでなければなりません。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。