>Java >java지도 시간 >Java for 루프의 멀티스레딩 문제를 해결하는 방법

Java for 루프의 멀티스레딩 문제를 해결하는 방법

WBOY
WBOY앞으로
2023-04-29 16:55:071857검색

    Java는 멀티스레딩을 사용하여 루프 효율성을 높입니다.

    잠금 기능이 있는 스레드 풀

    관련 지식: 실행자(스레드 풀), CountDownLatch(잠금)

    장점: 간결한 코드, 읽기 쉬움, 안정적인 성능;

    단점: Executors가 생성한 스레드 풀은 공개됩니다. 이 루프 멀티스레딩 방법을 여러 곳에서 사용하면 스레드 풀 리소스가 강탈되고 실행 속도도 저하됩니다.

    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 loop

    각 서비스는 비즈니스를 담당합니다. 여러 번 반복되는 작업을 수행하려면 for 루프를 사용해야 합니다. 예를 들어 저장된 ID 모음을 탐색하여 각 ID에 대해 무언가를 생성합니다.

    그러나 단일 스레드를 사용하여 작업을 실행하면 마지막 작업이 실행될 때까지 기다리는 데 많은 시간을 낭비하게 되며, 실행 중에 오류가 보고되면 작업 실행이 중지되는데 이는 분명히 우리의 요구 사항을 충족하지 않습니다.

    이 경우 for 루프에서 멀티스레딩을 사용하세요.

    아아아아

    위 내용은 Java for 루프의 멀티스레딩 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제