ホームページ  >  記事  >  Java  >  Java for ループのマルチスレッド問題を解決する方法

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

WBOY
WBOY転載
2023-04-29 16:55:071835ブラウズ
    #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 までご連絡ください。