首页 > 其他分享 >多线程与单线程执行的对比

多线程与单线程执行的对比

时间:2023-08-30 23:56:09浏览次数:42  
标签:333333333333 get 单线程 11111111111111 int 时间 多线程 对比 2222222222

对比技术点:
单线程:普通循环
多线程框架:CompletableFuture
多线程框架;ForkJoin
50次对比实验

 

源码:

 

package com.example.demo;

import org.apache.commons.lang3.time.StopWatch;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
import java.util.concurrent.atomic.AtomicInteger;

public class CacheAndIndexExample {


    public static void main(String[] args) {
        // 创建多个CompletableFuture任务
        for (int n = 0; n < 50; n++) {


        try {
            // 使用allOf方法等待所有任务完成
            StopWatch stopWatch = StopWatch.createStarted();
            CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> task1());
            CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> task2());
            CompletableFuture<Integer> future3 = CompletableFuture.supplyAsync(() -> task3());


            CompletableFuture.allOf(future1, future2, future3).join();
            // 获取每个任务的结果
            int result1 = future1.get();
            int result2 = future2.get();
            int result3 = future3.get();
            System.out.println("11111111111111时间:" + stopWatch.getTime());
            System.out.println("11111111111111结果:"+(result1+result2+result3));

            AtomicInteger atomicInteger = new AtomicInteger(0);
            StopWatch stopWatch0 = StopWatch.createStarted();
            for (int i = 0; i < 600000; i++) {
                if (get(i)) {
                    atomicInteger.getAndAdd(1);
                }
            }
            int i = atomicInteger.get();
            System.out.println("2222222222时间:" + stopWatch0.getTime());
            System.out.println("2222222222结果:"+i);
//            // 处理最终的结果
            ArrayList<Integer> arrayList = new ArrayList<>();
            for (int j = 0; j < 600000; j++) {
                arrayList.add(j);
            }
            ForkJoinPool forkJoinPool = new ForkJoinPool();
            StopWatch stopWatch1 = StopWatch.createStarted();
            MyTask task = new MyTask(arrayList);
            Integer invoke = forkJoinPool.invoke(task);
            System.out.println("333333333333时间:" + stopWatch1.getTime());
            System.out.println("33333333333结果:" + invoke);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        }
    }

    private static int task1() {
        AtomicInteger atomicInteger = new AtomicInteger(0);
        for (int i = 0; i < 200000; i++) {
            if (get(i)) {
                atomicInteger.getAndAdd(1);
            }
        }
        return atomicInteger.get();
    }

    private static Integer task2() {
        AtomicInteger atomicInteger = new AtomicInteger(0);
        for (int i = 0; i < 200000; i++) {
            if (get(i)) {
                atomicInteger.getAndAdd(1);
            }
        }
        return atomicInteger.get();
    }

    private static Integer task3() {
        AtomicInteger atomicInteger = new AtomicInteger(0);
        for (int i = 0; i < 200000; i++) {
            if (get(i)) {
                atomicInteger.getAndAdd(1);
            }
        }
        return atomicInteger.get();
    }

    private static boolean get(Integer i) {
        if (i % 2 == 0) {
            return true;
        }
        return false;
    }


    public static class MyTask extends RecursiveTask<Integer> {
        private static final int THRESHOLD = 100000;
        private List<Integer> start;


        public MyTask(List<Integer> start) {
            this.start = start;
        }

        @Override
        protected Integer compute() {
            boolean compute = start.size() <= THRESHOLD;
            if (compute) {
                // 执行任务的逻辑
                int sum = 0;
                int size = start.size();
                for (int i = 0; i < size; i++) {
                    if (get(i)) {
                        sum++;
                    }
                }
                return sum;
            } else {
                int mid = start.size() / 2;
                List<Integer> leftSubList = start.subList(0, mid);
                List<Integer> rightSubList = start.subList(mid, start.size());
                MyTask leftTask = new MyTask(leftSubList);
                MyTask rightTask = new MyTask(rightSubList);
                leftTask.fork();
                int rightResult = rightTask.compute();
                int leftResult = leftTask.join();
                return leftResult + rightResult;
            }
        }

        private boolean get(Integer i) {
            if (i % 2 == 0) {
                return true;
            }
            return false;
        }

//        private List<List<Integer>> splitList(List<Integer> bigList, int batchSize) {
//            List<List<Integer>> smallLists = new ArrayList<>();
//            int size = bigList.size();
//            for (int i = 0; i < size; i += batchSize) {
//                int fromIndex = i;
//                int toIndex = Math.min(i + batchSize, size);
//                List<Integer> smallList = bigList.subList(fromIndex, toIndex);
//                smallLists.add(smallList);
//            }
//            return smallLists;
//        }
    }
}

 

结果:

 

11111111111111时间:21    2222222222时间:16   333333333333时间:22
11111111111111时间:18    2222222222时间:5    333333333333时间:28
11111111111111时间:9      2222222222时间:11  333333333333时间:14
11111111111111时间:1       2222222222时间:2   333333333333时间:3
11111111111111时间:26     2222222222时间:5   333333333333时间:3
11111111111111时间:2     2222222222时间:5    333333333333时间:2
11111111111111时间:1     2222222222时间:11   333333333333时间:1
11111111111111时间:2    2222222222时间:27    333333333333时间:2
11111111111111时间:2   2222222222时间:2    333333333333时间:2
11111111111111时间:4   2222222222时间:33   333333333333时间:2
11111111111111时间:3   2222222222时间:3   333333333333时间:2
11111111111111时间:3  2222222222时间:3   333333333333时间:3
11111111111111时间:2   2222222222时间:5   333333333333时间:2
11111111111111时间:2   2222222222时间:5   333333333333时间:2
11111111111111时间:2   2222222222时间:42  333333333333时间:2
11111111111111时间:1   2222222222时间:2  333333333333时间:2
11111111111111时间:1   2222222222时间:2   333333333333时间:2
11111111111111时间:2   2222222222时间:50  333333333333时间:2
11111111111111时间:1   2222222222时间:2   333333333333时间:2
11111111111111时间:1   2222222222时间:2   333333333333时间:1
11111111111111时间:1   2222222222时间:3   333333333333时间:60
11111111111111时间:1   2222222222时间:2   333333333333时间:2
11111111111111时间:1   2222222222时间:2   333333333333时间:2
11111111111111时间:1   2222222222时间:2   333333333333时间:2
11111111111111时间:1   2222222222时间:2   333333333333时间:90
11111111111111时间:2   2222222222时间:5   333333333333时间:3
11111111111111时间:2   2222222222时间:5   333333333333时间:3
11111111111111时间:2   2222222222时间:5   333333333333时间:3
11111111111111时间:2   2222222222时间:6   333333333333时间:3
11111111111111时间:2
2222222222时间:68
333333333333时间:2
11111111111111时间:1
2222222222时间:2
333333333333时间:2
11111111111111时间:1
2222222222时间:2
333333333333时间:2
11111111111111时间:1
2222222222时间:2
333333333333时间:1
11111111111111时间:0
2222222222时间:2
333333333333时间:2
11111111111111时间:2
2222222222时间:5
333333333333时间:2
11111111111111时间:1
2222222222时间:2
333333333333时间:2
11111111111111时间:1
2222222222时间:2
333333333333时间:1
11111111111111时间:1
2222222222时间:2
333333333333时间:5
11111111111111时间:1
2222222222时间:2
333333333333时间:2
11111111111111时间:1
2222222222时间:2
333333333333时间:2
11111111111111时间:1
2222222222时间:2
333333333333时间:4
11111111111111时间:1
2222222222时间:3
333333333333时间:2
11111111111111时间:1
2222222222时间:2
333333333333时间:1
11111111111111时间:1
2222222222时间:2
333333333333时间:1
11111111111111时间:1
2222222222时间:2
333333333333时间:2
11111111111111时间:0
2222222222时间:2
333333333333时间:2
11111111111111时间:1
2222222222时间:2
333333333333时间:2
11111111111111时间:111
2222222222时间:6
333333333333时间:3
11111111111111时间:2
2222222222时间:7
333333333333时间:3
11111111111111时间:2
2222222222时间:6
333333333333时间:3

 

标签:333333333333,get,单线程,11111111111111,int,时间,多线程,对比,2222222222
From: https://www.cnblogs.com/wangbiaohistory/p/17668514.html

相关文章

  • java 使用多线程的注意事项
    线程安全:确保共享资源的正确访问和修改,避免并发冲突。可以通过同步机制(如锁、互斥量、信号量等)或使用线程安全的数据结构来实现线程安全。案例:银行账户并发访问importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;classBankAccount{......
  • 多线程执行工具方法
    publicstatic<P,T>List<CompletableFuture<T>>multiThreadRun(Function<P,T>run,Collection<P>list,intthreadSize,Executorexecutor,booleanwaitRunFinal){List<CompletableFuture<T>>cf=newArr......
  • python多线程
    python多线程多线程threading,利用CPU和IO可以同时执行的原理多进程multiprocessing,利用多核CPU的能力,真正的并行执行任务异步IOasyncio,在单线程利用CPU和IO同时执行的原理,实现函数异步执行使用Lock对资源加锁,防止冲突访问使用Queue实现不同线程/进程之间的数据通信,实现生......
  • leetcode & c++多线程刷题日志
    1.按序打印按序打印解法互斥锁classFoo{mutexmtx1,mtx2;public:Foo(){mtx1.lock(),mtx2.lock();}voidfirst(function<void()>printFirst){printFirst();mtx1.unlock();}voidsecond(function<voi......
  • 多线程|volatile的使用
    一、内存可见性问题先来看如下代码classMyCounter{publicintflag=0;}publicclassThreadDemo22{publicstaticvoidmain(String[]args){MyCountermyCounter=newMyCounter();Threadt1=newThread(()->{while(myCounter.f......
  • 深入探究Java中的多线程并发与同步
    在后端开发中,多线程编程是一项关键技术,能够充分利用多核处理器,提高系统性能和响应能力。然而,多线程编程涉及到并发与同步问题,可能引发复杂的线程安全难题。本篇博客将深入探讨Java中的多线程编程,重点关注并发问题和同步机制。并发与多线程并发是指多个任务在同一时间段内执行,而多线......
  • 多线程同步、异步
    1、首先明确一点,对于单核CPU,任意一个时刻只有一个线程在运行。那么既然这样,多线程还有什么意义呢?举例来说,现在只有一个人,要做好几个任务。单线程就是,任务一个一个地做,必须做完一个任务后,再去做另一个任务。多线程就是一会做这个任务,一会做那个任务,每个任务做一会,不停的切换。显然,......
  • 在ardiuno中把String变量#true#2a#3#转化为按照#分隔的数组, 然后再把数组第一个元素
    在Arduino中,你可以使用strtok()函数将一个String变量按照指定的分隔符切割为多个子字符串,并将它们存储到一个数组中。然后,你可以使用strcmp()函数将数组的第一个元素与字符串"true"进行比较。以下是一个示例,演示如何在Arduino中将String变量str按照#分隔符切割......
  • webpack生产环境优化:多线程打包
    转载请注明来源:http://www.eword.name/Author:ewordEmail:[email protected]生产环境优化:多线程打包多线程打包主要用于需要打包的文件较多的情况下提高打包效率,缩短打包时间。注意:开启多进程打包时,进程开启大概需要600ms,进程通信也有开销。建议:只有工作消耗时间......
  • webpack生产环境优化:多线程打包
    转载请注明来源:http://www.eword.name/Author:ewordEmail:[email protected]生产环境优化:多线程打包多线程打包主要用于需要打包的文件较多的情况下提高打包效率,缩短打包时间。注意:开启多进程打包时,进程开启大概需要600ms,进程通信也有开销。建议:只有工作消耗时间......