java使用多线程提升效率

文章展示了如何使用Java的ThreadPoolExecutor创建线程池来并行处理列表中的对象,每个对象执行耗时的操作。通过将任务分解并分配给多个线程,显著减少了总执行时间,从串行的460秒降低到并行的60秒。这种方法强调了多线程在提高CPU密集型任务效率方面的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java使用多线程提升效率

应用场景

循环处理一个列表,每个元素会进行一系列耗时读写操作。使用多线程提升运行速度

		List list;
        for (Object obj : list) {
            long time = System.currentTimeMillis();
            obj.doingSomething();
            System.out.println(System.currentTimeMillis() - time);
        }

代码实现

创建一个线程池

	private static final int CORE_POOL_SIZE = 10;
    private static final int MAX_POOL_SIZE = 10;
    private static final int QUEUE_CAPACITY = 100;
    private static final long KEEP_ALIVE_TIME = 1L;


ThreadPoolExecutor executor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(QUEUE_CAPACITY),new ThreadPoolExecutor.CallerRunsPolicy());

将任务均分成数份,分成多少份取决于单个任务的执行时间以及cpu的能力。

		//每个线程至少同步30条记录,计算线程数,不超过10个线程
        int threadSize = Math.min((int) Math.ceil(list.size() / 30D), MAX_POOL_SIZE);
        //计算平均每个任务数
        int taskNum = (int) Math.ceil(list.size() / (float) threadSize);
        for (int i = 0, size = threadSize - 1; i <= size; i++) {
            List<Object> subList= list.subList(i * taskNum, i < size ? (i + 1) * taskNum : list.size());
            ...
        }

使用Future保存每个线程执行结果,在最后轮询每个future状态来同步。

		List<Future> taskList = new ArrayList<>();
		for (int i = 0, size = threadSize - 1; i <= size; i++) {
            List<Object> subList= list.subList(i * taskNum, i < size ? (i + 1) * taskNum : list.size());
            taskList.add(executor.submit(() -> {
                for (Object obj : list) {
            		long time = System.currentTimeMillis();
            		obj.doingSomething();
            		System.out.println(System.currentTimeMillis() - time);
        		}
            }));
        }
        for (Future f : taskList) {
            while (true) {
                if (f.isDone() && !f.isCancelled()) {
                    break;
                }
            }
        }

运行结果

测试运行1700条记录,每条记录耗时约200ms。
串行共耗时约460s,并行共耗时约60s。效率明显提升

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值