Java多线程实战-求和

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cmm0401/article/details/83346882

Java多线程实战-求和

需求:开启五个线程,每个线程对一个给定数值从0开始累加求和。

(1)MyCallable.java

package com.storm_02;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.Callable;

/**
 * @Author: chenmengmeng
 * @Date: 2018/10/24 14:44
 * @Description:
 */
public class MyCallable implements Callable<List<String>> {
    private int taskNum;    //任务编号
    private int number;     //求和数值

    MyCallable(int taskNum, int number) {
        this.taskNum = taskNum;
        this.number = number;
    }

    @Override
    public List<String> call() {
        System.out.println(">>>" + taskNum + " 任务启动");
        Date dateTmp1 = new Date();

        //执行具体的任务内容
        long sum = 0;
        for (int x = 1; x <= number; x++) {
            sum += x;
        }

        //任务耗时
        Date dateTmp2 = new Date();
        long time = dateTmp2.getTime() - dateTmp1.getTime();

        System.out.println(">>>" + taskNum + " 任务结束");

        List<String> integerList = new ArrayList<>();
        integerList.add(String.valueOf(time));
        integerList.add(String.valueOf(sum));
        return integerList;
    }
}

(2)MyCallableTest.java

package com.storm_02;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * @Author: chenmengmeng
 * @Date: 2018/10/24 14:42
 * @Description:
 */
public class MyCallableDemo {
    public static void main(String[] args) throws Exception {
        System.out.println("---主程序执行开始---\n");
        Date dateBegin = new Date();

        //创建一个线程池
        int taskSize = 5;
        ExecutorService pool = Executors.newFixedThreadPool(taskSize);

        //并发任务的返回值列表
        List<Future> futureList = new ArrayList<>();
        for (int i = 1; i <= taskSize; i++) {
            //创建并发任务,执行并发任务并获取Future对象
            Future future = pool.submit(new MyCallable(i, i * 50000));
            futureList.add(future);
        }

        //关闭线程池
        pool.shutdown();

        Thread.currentThread().sleep(1000);
        System.out.println("--------------");

        //获取所有并发任务的运行结果
        if (!futureList.isEmpty()) {
            for (Future oneFuture : futureList) {
                List<String> stringList = (List<String>) oneFuture.get();
                if (!stringList.isEmpty()) {
                    System.out.println(">>>耗时" + stringList.get(0) + "毫秒" + "---" + "求和结果" + stringList.get(1));
                }
            }
        }

        Date dateEnd = new Date();
        long time = dateEnd.getTime() - dateBegin.getTime();
        System.out.println("\n---主程序执行结束,共运行时间【" + time + "】毫秒---");
    }
}

(3)运行结果:不同机器可能会不一样

猜你喜欢

转载自blog.csdn.net/cmm0401/article/details/83346882