考拉dt 2022-10-22 14:45 采纳率: 0%
浏览 13

并发对程序执行效率的影响

直接粘代码,如下:

package com.example.demo.test.threadPoolTest;

import com.example.demo.Entity.User;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 本示例有一个疑点:多线程到底什么情况下不仅不会提高效率,反而导致代码的执行效率下降?
 * runWithoutThread方法在单线程条件下向list集合添加10,000,000条数据,一般用时在8-9s左右,
 * 但开启多线程之后,执行所用的时间反而增加为11-14s左右,这种情况目前还没有找到原因
 */
public class ThreadTest02 {

    public static void main(String[] args) {
        runWithThread();
        runWithoutThread();
    }

    private static void runWithThread() {

        ThreadPoolExecutor thisPool = new ThreadPoolExecutor(10, 20,
                0, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10));

        ReentrantLock lock = new ReentrantLock();
        List<User> list = new ArrayList<>(10000000);
        Long startTime = System.currentTimeMillis();

        for (int i = 0; i < 10; i++) {
            thisPool.execute(() -> {
                while (true) {
                    if (list.size() < 10000000) {
                        User user = new User(Thread.currentThread().getName() + String.valueOf(Math.random()));
                        lock.lock();
                        if (list.size() < 10000000) {
                            list.add(user);
                        }
                        lock.unlock();
                    } else {
                        break;
                    }
                }
            });


        }

        while (true) {
            if (thisPool.getActiveCount() == 0) {
                Long endTime = System.currentTimeMillis();
                System.out.println("线程池并发运行用时" + (endTime - startTime));
//                System.out.println(list.size());
                break;
            }
        }
    }

    private static void runWithoutThread() {

        Long startTime = System.currentTimeMillis();

        List<User> list = new ArrayList<>(10000000);

        while (true) {
            if (list.size() < 10000000) {
                User user = new User(Thread.currentThread().getName() + String.valueOf(Math.random()));
                if (list.size() < 10000000) {
                    list.add(user);
                }
            } else {
                break;
            }
        }

        Long endTime = System.currentTimeMillis();

        System.out.println("单线程运行用时" + (endTime - startTime));

    }

}



运行结果:
线程池并发运行用时12924
单线程运行用时9583

  • 写回答

1条回答 默认 最新

  • 夜郎king 2022博客之星IT其它领域TOP 12 2022-10-22 15:25
    关注

    其实对多线程的理解也不是很深,就有限的知识来理解一下。在应用程序中利用多线程很多情况下是不阻塞当前的应用线程,在主线程以外开辟新线程来实现这个业务逻辑,同时为了增加一些效率,从而有了线程池这种池化的概念。但使用了多线程就一定能提高程序的执行效率,这是不科学的。所以还是结合一些实际案例和场景来探讨。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月22日

悬赏问题

  • ¥15 三分类机器学习模型可视化分析
  • ¥15 本地测试网站127.0.0.1 已拒绝连接,如何解决?(标签-ubuntu)
  • ¥50 Qt在release捕获异常并跟踪堆栈(有Demo,跑一下环境再回答)
  • ¥30 python,LLM 文本提炼
  • ¥15 关于将inet引入的相关问题
  • ¥15 关于一个倒计时的操作和显示设计
  • ¥15 提问STK的问题,哪位航天领域的同学会啊
  • ¥15 苹果系统的mac m1芯片的笔记本使用ce修改器使用不了
  • ¥15 单相逆变的电压电流双闭环中进行低通滤波PID算法改进
  • ¥15 关于#java#的问题,请各位专家解答!