Heim  >  Artikel  >  Java  >  So lösen Sie das Multithreading-Problem in der Java-for-Schleife

So lösen Sie das Multithreading-Problem in der Java-for-Schleife

WBOY
WBOYnach vorne
2023-04-29 16:55:071768Durchsuche

    Java verwendet Multithreading, um die Schleifeneffizienz zu beschleunigen

    Thread-Pool mit Sperrung

    Beteiligte Kenntnisse: Executors (Thread-Pool), CountDownLatch (Sperrung)

    Vorteile: prägnanter Code, leicht lesbar, stabile Leistung;

    Nachteile: Der von Executors erstellte Thread-Pool ist öffentlich. Wenn diese Schleifen-Multithreading-Methode an mehreren Stellen verwendet wird, werden Thread-Pool-Ressourcen geraubt und die Laufgeschwindigkeit wird ebenfalls verringert for-Schleife

    Jeder Dienst ist für ein wiederholtes Geschäft verantwortlich. Beispielsweise muss eine for-Schleife verwendet werden, um eine Sammlung gespeicherter IDs zu durchlaufen und für jede ID etwas zu erstellen.

    Aber die Verwendung eines einzelnen Threads zum Ausführen von Aufgaben verschwendet viel Zeit mit dem Warten auf die Ausführung der letzten Aufgabe, und sobald während einer Ausführung ein Fehler gemeldet wird, wird die Ausführung der Aufgabe gestoppt, was offensichtlich nicht unseren Anforderungen entspricht.

    Verwenden Sie in diesem Fall Multithreading in der for-Schleife.

    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"));
            }
     
        }
    }

    Das obige ist der detaillierte Inhalt vonSo lösen Sie das Multithreading-Problem in der Java-for-Schleife. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen