美文网首页
java.util.concurrent用多个线程并行计算一个数

java.util.concurrent用多个线程并行计算一个数

作者: 欢乐时光欢乐你我 | 来源:发表于2019-04-27 13:12 被阅读0次
image.png

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

你可以保存与每个任务相关联的Future,然后不断地调用 timeout为零的get,来检验Future是否完成。

Executors + FutureTask

package java多线程模拟并行计算框架;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
 
//用十个线程计算一个数组的和
class TaskWithResult implements Callable<Long>  {
    private Integer[] ints;
 
    public TaskWithResult(Integer[] ints) {
        this.ints = ints;
    }
 
    private long sumFromArray() {
        long result = 0;
        for (int a : this.ints) {
            result += a;
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return result;
    }
 
    public Long call() throws Exception {
        return sumFromArray();
    }
}
 
public class Paiallel1 {
    public static Integer[] segArray(int start, int end, int[] array) {
        List<Integer> result = new ArrayList<Integer>();
        for (int i = start; i < end; i++) {
            result.add(array[i]);
        }
 
        Integer[] ary = result.toArray(new Integer[result.size()]);
 
        return ary;
    }
    
    public static int getrandom(){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } 
        return new Random().nextInt(100);
    }
 
    public static long getSumDanXianCheng(int[] array) {
        long result = 0;
        for (int i = 0; i < array.length; i++) {
            result += array[i];
        }
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return result;
    }
 
    public static void main(String[] args) throws InterruptedException,
            ExecutionException {
        int  xcnum = 3;
        long start1 = System.currentTimeMillis();
        ExecutorService exec = Executors.newFixedThreadPool(xcnum);
        int num = 10000000;
        int[] array = new int[num];
        for(int i=0;i<num;i++){
            array[i]=40;
        }
 
        List<FutureTask<Long>> tasks = new ArrayList<FutureTask<Long>>();
 
        for (int i = 0; i < 10; i++) {
            int incre = array.length / 10;
            int start = i * incre;
            int end = (i + 1) * incre;
            if (end > array.length)
                end = array.length;
            Integer[] prt = segArray(start, end, array);
 
            TaskWithResult calbTask = new TaskWithResult(prt);
            //创建一个异步任务
            FutureTask<Long> task = new FutureTask<Long>(calbTask);
            tasks.add(task);
            if (!exec.isShutdown()) {
                //提交异步任务到线程池,让线程池管理任务 特爽把。
                //由于是异步并行任务,所以这里并不会阻塞
                exec.submit(task);
            }
        }
 
        long result = 0;
        for (FutureTask<Long> task : tasks) {
            //futureTask.get() 得到我们想要的结果 
            //该方法有一个重载get(long timeout, TimeUnit unit) 第一个参数为最大等待时间,第二个为时间的单位
            long partRst = task.get();
            result += partRst;
        }
        exec.shutdown();
        long end1 = System.currentTimeMillis();
        System.out.println("并行计算耗时ms:" + (end1 - start1));
        System.out.println("并行计算的结果:" + result);
         
        long start2 = System.currentTimeMillis();
        long result2 = getSumDanXianCheng(array);
        long end2 = System.currentTimeMillis();
         
        System.out.println("单独计算耗时ms:" + (end2 - start2));
        System.out.println("单独计算的结果:" + result2);
 
    }
 
}

相关文章

  • java.util.concurrent用多个线程并行计算一个数

    普通情况下,我们使用Runnable作为主要的任务表示形式,可是Runnable是一种有非常大局限的抽象,run方...

  • java.util.concurrent用多个线程并行计算一个数

    import java.util.concurrent.Callable;import java.util.con...

  • 第一章 大数据处理技术简介

    并行计算技术 并行计算:定义: 同时对多条指令,多个任务或多个数据进行处理的一种计算技术并行计算系统:实现并行计算...

  • 关于FMDB多线程的问题

    FMDB在插入多个数据的时候,如果放在主线程会堵塞主线程,所以应该放在支线程进行.但是多个线程同时访问同个数据对象...

  • JUC编程

    java.util.concurrent下的包 volatile关键字 定义:当多个线程操作共享数据时,可以保证内...

  • 补充: `threading.local`,session源码

    threading.local 多个线程修改同一个数据,复制多份变量给每个线程用,为每个线程开辟一块空间进行数据存...

  • 2019-08-08 awk 按行数切割文件

    一个文件用perl计算时间太长,又不会设计多线程和并行计算,只好将原始文件切割成多个小文件一起跑,最后再把结果合并...

  • 面试题-多线程Demo

    题目1 一个数组,多个线程去打印数组内容。要求多个线程按数组下标顺序打印,多个线程打印内容不能重复。 题目2 A线...

  • 线程共享安全问题

    数据的存储跟线程无关;一个进程中的数据在多个线程中可以直接用 当多线程同时处理一个数据时,数据可能会产生问题;所以...

  • iOS GCD

    多线程使用中注意的问题: 数据竞争: 多个线程访问同一个数据源 死锁:多个线程相互等待对方的完成 太多的线程将导...

网友评论

      本文标题:java.util.concurrent用多个线程并行计算一个数

      本文链接:https://www.haomeiwen.com/subject/pztknqtx.html