java多线程工具类封装(有返回值和无返回值)

  • Post author:
  • Post category:java


在开发的过程中,我们很多的场景都需要使用了多线程来进行操作,有些需要返回处理结果,有些不需要,直接进行操作,为了防止项目中出现多个线程池的定义,导致代码较为混乱,本次基于目的进行多线程工具类的封装。

一:定义工具类

public class TaskUtil {

    private static ThreadPoolExecutor executors = null;

    private static ThreadPoolExecutor syncExecutors = null;

    private static final Logger logger = LoggerFactory.getLogger(TaskUtil.class);


    static {
        int threadSize = 20;
        executors = new ThreadPoolExecutor(threadSize, threadSize,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>(1000));

        syncExecutors = new ThreadPoolExecutor(60, 60,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>(1000));
    }

    /**
     * 多线程异步处理任务
     *
     * @param task
     */
    public static void run(Runnable task) {
        try {
            executors.execute(task);
        } catch (Exception e) {
            logger.error("", e);
        }
    }

    /**
     * 执行操作,并获取执行结果
     *
     * @param
     * @param
     * @param
     * @param
     * @return
     */
    public static String taskWithResult(String name) {


        try {
            CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
                try {
                    logger.info("开始" + name);
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return name;
            }, syncExecutors);
            cf1.join();
        } catch (Exception e) {
            logger.error("taskWithResult 任务执行失败", e);
            return null;
        }

        return name;
    }


}

我们使用ThreadPoolExecutor来自定义的创建线程池,分别疯转了无返回值和有返回值两种

开始样例测试

二:接口类

public interface taskService {

    void taskServiceMsg(String name);

    String taskWithResult(String name);
}

三:定义接口使用类

@Service
public class taskServiceImpl implements taskService {

    public static List<String> list = new ArrayList<>();

    private static final Logger logger = LoggerFactory.getLogger(TaskUtil.class);

    @Override
    public void taskServiceMsg(String name) {
        TaskUtil.run(() -> {
            if (!StringUtil.isNullOrEmpty(name)) {
                try {
                    logger.info("开始执行" + name);
                    Thread.sleep(2000);
                    list.add(name);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }


            }
        });
    }

    @Override
    public String taskWithResult(String name) {

        String result = TaskUtil.taskWithResult(name);

        return result;
    }

四:调用类编写

    @ResponseBody
    @RequestMapping("3")
    public List<String> test3() {

        for (int i = 0; i < 100; i++) {
            task.taskServiceMsg("text" + i);
        }
        return taskServiceImpl.list;
//        return "异步执行";
    }

    @ResponseBody
    @RequestMapping("4")
    public String test4() {

        String result = "";
        final int k = 0;
        for (int i = 0; i < 10000; i++) {

            result = task.taskWithResult("name" + i);
        }
        return result;
    }

测试结果:

本次只是做了一些简单的测试,业务的逻辑需要业务方各自根据自己的业务需求进行改造,但思路都基本不变。



版权声明:本文为weixin_40593587原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。