Rumah  >  Artikel  >  Java  >  Bagaimana untuk menyelesaikan masalah multi-threading dalam java untuk gelung

Bagaimana untuk menyelesaikan masalah multi-threading dalam java untuk gelung

WBOY
WBOYke hadapan
2023-04-29 16:55:071835semak imbas

    Java menggunakan pelbagai benang untuk mempercepatkan kecekapan kitaran

    Kolam benang dengan penguncian

    Pengetahuan yang terlibat: Pelaksana (kolam benang), CountDownLatch ( Mengunci)

    Kelebihan: Kod ini ringkas, mudah dibaca dan prestasinya stabil;

    Kelemahan: Kumpulan benang yang dibuat oleh Pelaksana adalah umum kaedah digunakan di berbilang tempat, Ia akan merompak sumber kumpulan benang, jadi kelajuan larian juga akan dikurangkan

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

    Gunakan berbilang benang dalam gelung untuk

    Setiap perkhidmatan bertanggungjawab untuk; satu perniagaan. Jika anda melakukan perniagaan berulang beberapa kali, anda perlu menggunakan gelung for , seperti melintasi koleksi id yang disimpan dan mencipta sesuatu untuk setiap id.

    Walau bagaimanapun, menggunakan satu utas untuk melaksanakan tugas akan membuang banyak masa menunggu tugasan terakhir dilaksanakan, dan sebaik sahaja ralat dilaporkan semasa pelaksanaan, tugas itu akan berhenti melaksanakan, yang jelas tidak memenuhi keperluan kami.

    Dalam kes ini, gunakan berbilang benang dalam gelung for.

    rreeee

    Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah multi-threading dalam java untuk gelung. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam