マルチスレッド研究ノート(3)マルチスレッドスレッドプール

前書き

ビジネスの同時実行性が高い場合はマルチスレッドを使用する必要があり、通常のマルチスレッドプログラムを実行する場合は、スレッドの作成と破棄が何度も繰り返されます。これらの不要で繰り返されるコンピューティングタスクにより、プログラムの複雑さが増します。コンピュータプログラミングの原則的な方向性に準拠していません。コンピュータの使用効率を向上させるために、前任者はスレッドプールの使用を提案しました。これにより、スレッドの繰り返しの作成と破棄がある程度回避され、大幅に向上します。プログラムの実行効率と堅牢性。

スレッドプールの紹介と使用法

スレッドプールとは何ですか?

  • 名前が示すように、スレッドプールはスレッドを保持する「プール」、つまり複数のマルチスレッドプログラムを保持できるコンテナです。これの利点は、スレッドを繰り返し閉じたり、スレッドを開いたりするオーバーヘッドを回避できることです。マルチスレッドプログラムの実行。プログラムの時間の複雑さを大幅に減らします。代償は、プログラムのスペースの複雑さを少し増やすことです。

スレッドプールの原則

  • スレッドプールの原理は非常に単純です。まず、スレッドプールを作成します。スレッドプールには複数のスレッドが含まれます。システムで実行するタスクフラグメントが複数ある場合、現在のタスクフラグメントをスレッド内のスレッドと一致させることができます。プール。タスクが成功した場合タスクフラグメントは、スレッドオブジェクトを取得することで実行できます。このプロセスの概略図は次のとおりです。
    ここに画像の説明を挿入
  • タスクの実行が完了すると、システムは自動的にスレッドリソースを返します。上の図では、タスク3と4はスレッドリソースを取得していないため、順番に待機する必要があります。
  • スレッドプールはコレクションで構成され、Javaの一般的なコレクションにはArrayList、HashSet、LinkList、HashMapがあります。これらのコレクションの特性に応じて、スレッドプールコンテナに最適なコレクションはLinkListです。スレッドのLinkList実装の概略図プールを以下に示します。
    ここに画像の説明を挿入

スレッドプールケース

jdk1.5バージョン以降、jdkには、java.util.concurrentパッケージで統合されたスレッドプールクラスが含まれています。スレッドプールを使用する場合は、パッケージを直接インポートできます。前のメモと同様に、Xiao Yuanもこのメモでチケット購入ケースを使用します。以下は、XiaoYuanのケースコードです。
実行可能なインターフェイス実装クラス:

public class MyRunnableImpl implements Runnable{
    private static int ticket =100;
    private  int ticket2 =500;
    private  static volatile boolean sellOutFlag=false;
    private   String name;
    public MyRunnableImpl() {

    }
    public MyRunnableImpl(String name) {
        this.name = name;
    }
    @Override
    public void run() {

        while (!sellOutFlag) {
            sellTicketStatic();
            //sellTicket();
        }
    }
    //锁对象是自己
    private synchronized void sellTicket() {
            if(ticket>0){
                //System.out.println(this.name+"正在卖出第:"+ticket+"张票");
                System.out.println(Thread.currentThread().getName()+"正在卖出第:"+ticket+"张票");
                //所以打印出来会连续减三
                ticket --;
                //System.out.println(name+"正在卖出第:"+ticket+"张票");
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }else {
                sellOutFlag = true;
            }
    }
    //锁对象是MyRunnableImpl类
    public  static synchronized void sellTicketStatic(){

            if(ticket>0){
                //System.out.println(this.name+"正在卖出第:"+ticket+"张票");
                //System.out.println(name+"正在卖出第:"+ticket+"张票");
                System.out.println(Thread.currentThread().getName()+"正在卖出第:"+ticket+"张票");
                ticket --;
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }else {
                sellOutFlag = true;
            }
    }
}

テストクラス

public class ThreadPoolDemoTest {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        executorService.submit(new MyRunnableImpl("窗口一"));
        executorService.submit(new MyRunnableImpl("窗口二"));
        executorService.submit(new MyRunnableImpl("窗口三"));
        executorService.shutdown();
    }
}

試験結果
ここに画像の説明を挿入
ここに画像の説明を挿入

総括する

上記のコードでは、Xiaoyuanはスレッドプールの数を3に固定し、3つのスレッドプールは実行する3つのスレッドにも対応できるため、テスト結果は3つのスレッドすべてがチケットを購入しているという条件になります。スレッドプール2に固定されている場合、原則によれば、チケットを販売するスレッドは2つだけである必要があります。具体的なテストは。Xiao Yuanは、すべての学生が暇なときにテストを受けることをお勧めします。

おすすめ

転載: blog.csdn.net/xueshanfeitian/article/details/106671652
おすすめ