Java多线程之利用线程池并行计算例子

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 import java.util.concurrent.*;
 4 import java.util.concurrent.Callable;
 5 import java.util.concurrent.ExecutorService;
 6 import java.util.concurrent.Executors;
 7 import java.util.concurrent.Future;
 8
 9 /**
10  * 并行计算例子
11  * nasa
12  */
13 public class ParallelComputing {
14
15     public static void main(String[] args) {
16
17         long startTime = System.currentTimeMillis();
18         List<Integer> results = getPrime(1, 200000);
19         long endTime = System.currentTimeMillis();
20         System.out.println("耗时:" + (endTime -startTime));
21
22         final int cpuCoreNum = 4;
23
24         ExecutorService service = Executors.newFixedThreadPool(cpuCoreNum);
25
26         MyTask t1 = new MyTask(1, 80000);
27         MyTask t2 = new MyTask(80001, 130000);
28         MyTask t3 = new MyTask(130001, 170000);
29         MyTask t4 = new MyTask(170001, 200000); //为什么不平均分 和质数计算速度有关
30
31         Future<List<Integer>> s1 = service.submit(t1);
32         Future<List<Integer>> s2 = service.submit(t2);
33         Future<List<Integer>> s3 = service.submit(t3);
34         Future<List<Integer>> s4 = service.submit(t4);
35
36         startTime = System.currentTimeMillis();
37         try {
38             System.out.println(s1.get());
39             System.out.println(s2.get());
40             System.out.println(s3.get());
41             System.out.println(s4.get());
42         } catch (InterruptedException e) {
43             e.printStackTrace();
44         } catch (ExecutionException e) {
45             e.printStackTrace();
46         }
47         endTime = System.currentTimeMillis();
48         System.out.println("耗时:" + (endTime - startTime));
49         service.shutdown();
50     }
51
52     static class MyTask implements Callable<List<Integer>> {
53
54         int startPos, endPos;
55
56         MyTask(int start, int end) {
57             this.startPos = start;
58             this.endPos = end;
59         }
60
61         @Override
62         public List<Integer> call() throws Exception {
63             List<Integer> result = getPrime(startPos, endPos);
64             return result;
65         }
66     }
67
68     /**
69      * 判断是不是素数或质数
70      * @param num
71      * @return
72      */
73     static boolean isPrime(int num) {
74         for (int i=2; i<=num/2; i++) {
75             if(num % i == 0) return false;
76         }
77         return true;
78     }
79
80     /**
81      * 给一个范围判断这个范围内有多少个质数
82      * @param start
83      * @param end
84      * @return
85      */
86     static List<Integer> getPrime(int start, int end) {
87         List<Integer> results = new ArrayList<>();
88         for (int i=start; i<=end; i++) {
89             if(isPrime(i)) results.add(i);
90         }
91         return results;
92     }
93
94 }

原文地址:https://www.cnblogs.com/mxh-java/p/12244321.html

时间: 2024-10-19 07:09:33

Java多线程之利用线程池并行计算例子的相关文章

Java多线程-新特性-线程池

Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定可靠的多线程程序,线程部分的新增内容显得尤为重要. 有关Java5线程新特征的内容全部在java.util.concurrent下面,里面包含数目众多的接口和类,熟悉这部分API特征是一项艰难的学习过程.目前有关这方面的资料和书籍都少之又少,大部分介绍线程方面书籍还停留在java5之前的知识层面上. 在Java5之

Java多线程设计模式(4)线程池模式

前序: Thread-Per-Message Pattern,是一种对于每个命令或请求,都分配一个线程,由这个线程执行工作.它将“委托消息的一端”和“执行消息的一端”用两个不同的线程来实现.该线程模式主要包括三个部分: 1,Request参与者(委托人),也就是消息发送端或者命令请求端 2,Host参与者,接受消息的请求,负责为每个消息分配一个工作线程. 3,Worker参与者,具体执行Request参与者的任务的线程,由Host参与者来启动. 由于常规调用一个方法后,必须等待该方法完全执行完毕

Java多线程系列--“JUC线程池”01之 线程池架构

概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介绍JUC的最后一部分的内容——线程池.内容包括:线程池架构图线程池示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509903.html 线程池架构图 线程池的架构图如下: 1. Executor 它是"执行者"接口,它是来执行任务的.准确的说,Executor提供了execute()接口来执行

Java多线程系列--“JUC线程池”03之 线程池原理(二)

线程池示例 在分析线程池之前,先看一个简单的线程池示例. import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; public class ThreadPoolDemo1 { public static void main(String[] args) { // 创建一个可重用固定线程数的线程池 ExecutorService pool = Executors.newFixedThre

Java多线程系列--“JUC线程池”05之 线程池原理(四)

拒绝策略介绍 线程池的拒绝策略,是指当任务添加到线程池中被拒绝,而采取的处理措施.当任务添加到线程池中之所以被拒绝,可能是由于:第一,线程池异常关闭.第二,任务数量超过线程池的最大限制. 线程池共包括4种拒绝策略,它们分别是:AbortPolicy, CallerRunsPolicy, DiscardOldestPolicy和DiscardPolicy. AbortPolicy -- 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常. Calle

Java多线程——Executors和线程池

线程池的概念与Executors类的应用 1.创建固定大小的线程池 package java_thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class ThreadPoolTest { /** * @param args */ public static void mai

Java多线程系列--“JUC线程池”06之 Callable和Future

概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3544116.html Callable 和 Future 简介 Callable 和 Future 是比较有趣的一对组合.当我们需要获取线程的执行结果时,就需要用到它们.Callable用于产生结果,Future用于获取结果. 1. Callable Calla

Java多线程系列--“JUC线程池”02之 线程池原理(一)

ThreadPoolExecutor简介 ThreadPoolExecutor是线程池类.对于线程池,可以通俗的将它理解为"存放一定数量线程的一个线程集合.线程池允许同时运行的线程数量就是线程池的容量:当添加到线程池中的线程超过它的容量时,会有一部分线程阻塞等待.线程池会通过相应的调度策略和拒绝策略,对添加到线程池中的线程进行管理." ThreadPoolExecutor数据结构 ThreadPoolExecutor的数据结构如下图所示: 各个数据在ThreadPoolExecutor

Java多线程18:线程池

使用线程池与不使用线程池的差别 先来看一下使用线程池与不适应线程池的差别,第一段代码是使用线程池的: public static void main(String[] args) { long startTime = System.currentTimeMillis(); final List<Integer> l = new LinkedList<Integer>(); ThreadPoolExecutor tp = new ThreadPoolExecutor(100, 100