ホームページ > Java > &#&チュートリアル > Java for ループのマルチスレッド問題を解決する方法

Java for ループのマルチスレッド問題を解決する方法

WBOY
リリース: 2023-04-29 16:55:07
転載
1864 人が閲覧しました
    #Java はマルチスレッドを使用してループ効率を高速化します

    ロック付きスレッド プール

    関連知識: エグゼキュータ (スレッド プール)、 CountDownLatch (ロック)

    長所: コードが簡潔で読みやすく、パフォーマンスが安定している;

    短所: Executor によって作成されたスレッド プールが公開される。メソッドは複数の場所で使用されます。スレッド プールのリソースが奪われるため、実行速度も低下します。

    import java.util.*;
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
     
    public class test{
     
        /** 固定的线程池(当前线程池大小为5) */
        private static final ExecutorService executor = Executors.newFixedThreadPool(5);
        
        public static void main(String[] args) throws Exception {
            /**
             *  两个要点:
             *  1.用Executors实现固定大小的线程池,从而达到控制硬件资源消耗的目的。
             *  2.用CountDownLatch(闭锁),来确保循环内的多线程都执行完成后,再执行后续代码
             */
            
            // 初始化数据
            List<Map<String,Object>> list = new ArrayList<>();
            for(int i=0;i<50;i++){
                Map<String,Object> object = new HashMap<>();
                object.put("index",i);
                list.add(object);
            }
     
            // 初始化计时器
            CountDownLatch cdl = new CountDownLatch(list.size());
            System.out.println("====== 线程开始 =====");
     
            // 遍历
            for(Map<String,Object> object:list){
                // 开启线程
                executor.submit(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread t = Thread.currentThread();
                            String name = t.getName();
                            // 模拟运行耗时
                            Thread.sleep(500);
                            System.out.println(name+":执行到"+object.get("index"));
                            object.put("status","已经执行过");
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        // 闭锁-1
                        cdl.countDown();
                    }
                });
            }
            
            // 调用闭锁的await()方法,该线程会被挂起,它会等待直到count值为0才继续执行
            // 这样我们就能确保上面多线程都执行完了才走后续代码
            cdl.await();
            
            //关闭线程池
            executor.shutdown();
            System.out.println("====== 线程结束 =====");
     
            // 校验多线程正确性
            for(Map<String,Object> object:list){
                System.out.println(object.get("index") + ":" + object.get("status"));
            }
     
        }
    }
    ログイン後にコピー

    for ループでマルチスレッドを使用します。

    各サービスは次のことを担当します。 1 つのビジネス。ビジネスを複数回繰り返す場合は、保存されている ID のコレクションを走査して ID ごとに何かを作成するなど、for ループを使用する必要があります。

    しかし、単一のスレッドを使用してタスクを実行すると、最後のタスクが実行されるまで待機するのに多くの時間が無駄になり、実行中にエラーが報告されるとタスクは実行を停止します。これは明らかに条件を満たしていません。私たちの要件。

    この場合、for ループでマルチスレッドを使用します。

    rree

    以上がJava for ループのマルチスレッド問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    関連ラベル:
    ソース:yisu.com
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート