首页 > 编程语言 >Java并发处理任务

Java并发处理任务

时间:2023-07-21 10:35:29浏览次数:41  
标签:Java System submit InterruptedException threadPool 并发 任务 new ThreadPoolExecutor

背景

当一个任务执行时间过长的时候,并且这个任务可以分解成多个独立的任务时,可以使用Java多线程来减少执行时间。

第一版

public static void main(String[] args) throws ExecutionException, InterruptedException {
        func1();
    }

    private static void func1() throws ExecutionException, InterruptedException {
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 5, 5, TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(2000), new ThreadPoolExecutor.CallerRunsPolicy());
        Callable<Integer> callable = () -> {
            try {
                Thread.sleep(1000L);
                return 1;
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        };
        int n = 10;
        long start = System.currentTimeMillis();
        for (int i = 0; i < n; i++) {
            Future<Integer> submit = threadPool.submit(callable);
            Integer result = submit.get();
            System.out.println(result);
        }
        long end = System.currentTimeMillis();
        System.out.println((end - start) / 1000.0);
        threadPool.shutdown();
    }
}

发现这个版本并没有减少时间,原因是submit.get()会阻塞,会一直等到拿到结果才返回。

第二版

public static void main(String[] args) throws ExecutionException, InterruptedException {
        // func1();
        func2();
    }

    private static void func2() throws ExecutionException, InterruptedException {
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 5, 5, TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(2000), new ThreadPoolExecutor.CallerRunsPolicy());
        Callable<Integer> callable = () -> {
            try {
                Thread.sleep(2000L);
                return 1;
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        };
        int n = 10;
        List<Future<Integer>> futureList = Lists.newArrayList();
        long start = System.currentTimeMillis();
        for (int i = 0; i < n; i++) {
            futureList.add(threadPool.submit(callable));
        }
        for (Future<Integer> submit : futureList) {
            System.out.println(submit.get());
        }
        long end = System.currentTimeMillis();
        System.out.println((end - start) / 1000.0);
        threadPool.shutdown();
    }
}

可以先把预存结果放到一个列表里,然后统一取结果

第三版

 public static void main(String[] args) throws ExecutionException, InterruptedException {
        // func1(10);
        // func2(100);
        func3(100);
    }

    private static void func3(int n) throws ExecutionException, InterruptedException {
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 5, 5, TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(2000), new ThreadPoolExecutor.CallerRunsPolicy());
        Callable<Integer> callable = () -> {
            try {
                Thread.sleep(1000L);
                return 1;
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        };

        CompletionService<Integer> completionService = new ExecutorCompletionService<>(threadPool);
        long start = System.currentTimeMillis();
        for (int i = 0; i < n; i++) {
            completionService.submit(callable);
        }
        for (int i = 0; i < n; i++) {
            System.out.println(completionService.take().get());
        }
        long end = System.currentTimeMillis();
        System.out.println((end - start) / 1000.0);
        threadPool.shutdown();
    }
}

可以用现成的ExecutorCompletionService

标签:Java,System,submit,InterruptedException,threadPool,并发,任务,new,ThreadPoolExecutor
From: https://www.cnblogs.com/eaglelihh/p/17569529.html

相关文章

  • CMPP2协议的Java实现方式
    CMPP2协议的Java实现方式在移动通信领域,短信服务一直是非常重要的一部分。为了实现高效、稳定的短信传输,运营商们制定了一系列短信协议。其中,CMPP2协议是目前最常用的一种协议之一。本文将着重介绍CMPP2协议的Java实现方式,帮助读者更好地了解和应用这一协议。首先,我们需要明确C......
  • JavaIO中的缓冲流有什么作用如何使用缓冲流进行IO操作
     缓冲流在JavaIO中扮演着非常重要的角色,它可以提高IO操作的效率,减少访问硬盘的次数。在本文中,我们将探讨JavaIO中的缓冲流的作用,并演示如何使用缓冲流进行IO操作。首先,让我们了解一下什么是缓冲流。缓冲流是一种高级流,它通过在内存中创建缓冲区来提高IO的效率。当我们使用缓冲......
  • 9探索Java内置函数的隐藏功能和高级用法
     Java作为一种广泛使用的编程语言,拥有丰富的内置函数库,这些函数可以大大简化开发过程,并提供了许多强大的功能。然而,除了常见的用法之外,Java内置函数还具有一些隐藏的功能和高级用法,这些功能和用法可能被开发者所忽视,但却能提高代码的效率和可读性。本文将围绕这一主题,探索Java内......
  • 9Java中如何判断一个字符串是否包含另一个子串
    在Java中,我们经常会遇到需要判断一个字符串是否包含另一个子串的情况。对于这个问题,我们可以使用一些简单而有效的方法来解决。本文将介绍几种常见的方法,以及它们的优缺点。方法一:使用contains方法Java中的String类提供了一个contains方法,可以很方便地判断一个字符串是否包含另......
  • 面霸的自我修养:Java线程专题
    王有志,一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群:共同富裕的Java人平时我在网上冲浪的时候,收集了不少八股文和面试文,内容虽然多,但质量上良莠不齐,主打一个不假思索的互相抄,使得很多错误内容一代代得“传承”了下来。所以,我对收集的内容做了归纳和整理,通过查阅资料......
  • java根据ConcurrentHashMap自定义本地缓存
    packagecom.sxsoft.config;importjava.util.Map;importjava.util.concurrent.ConcurrentHashMap;importcom.istrong.ec.common.utils.StringUtils;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.annotation.......
  • windows java 递归找到文件夹,并修改名称
    WindowsJava递归找到文件夹并修改名称说明在这篇文章中,我将向你解释如何使用Java编写一个递归算法,用于在Windows操作系统中找到文件夹并修改其名称。我将使用Java在Windows环境中进行文件和目录操作。在这个过程中,你将学习如何使用Java的File类来遍历目录树、找到文件夹、修改......
  • 多行注释快捷键JAVA
    多行注释是编程中常用的注释方式,它可以帮助程序员在代码中添加注释信息,提高代码的可读性和可维护性。在Java中,多行注释使用/**和*/将注释内容包围起来。多行注释的作用多行注释可以用来添加对代码进行解释、说明和文档化的信息。它可以用于以下几个方面:解释代码的用途和设计思......
  • 对java被引用的jar包加密
    对Java被引用的JAR包加密在Java开发过程中,我们经常引用各种第三方库的JAR包来实现各种功能。然而,有时我们希望对这些被引用的JAR包进行加密,以保护代码的安全性和知识产权。本文将介绍如何对Java被引用的JAR包进行加密,并提供相关的代码示例。为什么需要加密JAR包Java的JAR包是一......
  • vue小程序图片java后端怎么存
    Vue小程序图片Java后端存储方案在Vue小程序中,我们常常需要处理图片的上传和存储。而Java后端则负责接收上传的图片,并进行存储和处理。本文将介绍一种解决方案,用于实现Vue小程序图片的上传和Java后端存储。问题描述在Vue小程序中,用户需要通过选择图片的方式上传图片。而Java后端......