以计算0到1000之间的和为例

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;public class Main {
//求1~N全部整数的和,会上溢
int N = (int) 1e8;
int threadSize = 5;/*** 最原始最基础的方式:使用thread,自定义并发*/
class ThreadJoin {void go() {Thread[] a = new Thread[threadSize];//每个线程应该干多少活int per = (int) Math.ceil(N * 1.0 / a.length);final AtomicInteger s = new AtomicInteger(0);for (int i = 0; i < a.length; i++) {int ii = i;a[i] = new Thread(() -> {int sum = 0;for (int j = ii * per; j < Math.min(ii * per + per, N); j++) {sum += j;}s.addAndGet(sum);});a[i].start();}for (Thread i : a)try {i.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(s.get() + " " + getClass().getName());}
}/*** 重量级的多线程框架:ThreadPoolExecutor,维护一个动态线程池*/
class UseThreadPoolExecutor {void go() {ThreadPoolExecutor executor = new ThreadPoolExecutor(threadSize, threadSize, 1, TimeUnit.SECONDS, new LinkedBlockingDeque<>());int per = (int) (Math.ceil(1.0 * N / threadSize));List<Future<Integer>> futureList = new LinkedList<>();for (int i = 0; i < threadSize; i++) {final int ii = i;futureList.add(executor.submit(() -> {int sum = 0;for (int j = ii * per; j < Math.min(N, ii * per + per); j++) {sum += j;}return sum;}));}int sum = 0;for (Future<Integer> j : futureList) {try {sum += j.get(Integer.MAX_VALUE, TimeUnit.SECONDS);} catch (Exception e) {e.printStackTrace();}}executor.shutdown();System.out.println(sum + " " + getClass().getName());}
}/*** ExecutorService:轻量级的线程池*/
class UseExecutorService {void go() {ExecutorService service = Executors.newFixedThreadPool(threadSize);int per = (int) (Math.ceil(N * 1.0 / threadSize));List<Future<Integer>> futureList = new LinkedList<>();for (int i = 0; i < threadSize; i++) {final int ii = i;futureList.add(service.submit(() -> {int sum = 0;for (int j = ii * per; j < Math.min(N, ii * per + per); j++) {sum += j;}return sum;}));}int sum = 0;for (Future<Integer> j : futureList) {try {sum += j.get(Integer.MAX_VALUE, TimeUnit.SECONDS);} catch (Exception e) {e.printStackTrace();}}service.shutdown();System.out.println(sum + " " + getClass().getName());}
}/*** 模拟Linux fork join操作*/class UseForkJoin {void go() {int per = (int) (Math.ceil(1.0 * N / threadSize));List<ForkJoinTask<Integer>> a = new ArrayList<>(threadSize);for (int i = 0; i < threadSize; i++) {final int ii = i;a.add(new RecursiveTask<Integer>() {@Overrideprotected Integer compute() {int sum = 0;for (int j = ii * per; j < Math.min(N, ii * per + per); j++) {sum += j;}return sum;}});a.get(i).invoke();}int s = 0;for (ForkJoinTask<Integer> i : a) {s += i.join();}System.out.println(s + " " + getClass().getName());}
}Main() {new ThreadJoin().go();new UseExecutorService().go();new UseThreadPoolExecutor().go();new UseForkJoin().go();
}public static void main(String[] args) {new Main();
}
}

转载于:https://www.cnblogs.com/weiyinfu/p/9703790.html

Java实现多线程的四种实现方式相关推荐

  1. Java 实现多线程的四种方式 超详细

    Java 实现多线程的四种方式 文章目录 Java 实现多线程的四种方式 一.继承 Thread 类 二.实现 Runnable 接口 三.实现 Callable 接口 四.线程池 1,Executo ...

  2. java创建多线程的四种方式

    java多线程的创建方式是面试经常会被问到的一个问题,因此在这里我对java创建多线程的四种方式做一个简单的归纳与总结,便于复习. 一.继承Thread类创建多线程 ① 创建一个继承于Thread类的 ...

  3. Java线程池的四种创建方式

    Java线程池的四种创建方式 Java使用Thread类来表示线程,所有的线程都是Thread类或者是他的子类.Java有四种方式来创建线程. (1)继承Thread类创建线程 (2)实现Runnab ...

  4. Java 实现多线程的四种方式

    在 Java 中实现多线程一共有四种方式: 继承 Thread 类 实现 Runnable 接口 实现 Callable 接口 线程池 下面我将对这四种方式进行入门级的解析和演示. 一.继承 Thre ...

  5. Java:简述Java多线程的四种实现方式

    关联文章:<Java:简述Java中的多线程编程> Java多线程实现方式主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来 ...

  6. java线程的实现方法_Java多线程的四种实现方式

    1.Java多线程实现的方式有四种: 1.继承Thread类,重写run方法 2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的targ ...

  7. 多线程的四种实现方式

    1.继承Thread类,重写run方法 2.实现Runnable接口,重写run方法 3.通过Callable和ExecutorService创建线程 4.通过线程池创建线程 前面两种可以归结为一类: ...

  8. Java创建多线程的8种代码方式

    1.继承Thread类,重写run()方法 //方式1 package cn.itcats.thread.Test1;public class Demo1 extends Thread{//重写的是父 ...

  9. Java基础14 集合(重要)四种遍历方式 list 并发异常 set

    一.collection 带all的方法 package day14;import java.util.ArrayList; import java.util.Collection;public cl ...

最新文章

  1. c语言相邻字符串字面量,C语言预处理#运算符的细节
  2. linux c 内存分配函数
  3. 帝国Cms批量上传多图morepic上传超过最大文件2m的限制的方法
  4. 统计某一时刻的在线人数
  5. 【转载】struts应用在断网情况下启动报错解决办法(java/net/AbstractPlainSocketImpl.java:178:-1)...
  6. hunnu---11547 你的组合数学学得如何?
  7. python复数的实部和虚部都是整数嘛_Python学习笔记:从入门到放弃(2)基本语法...
  8. python语言训练教程_PYTHON零基础快乐学习之旅(K12实战训练)
  9. linux 网络 路由,网络路由的顺序在Linux中是否重要?
  10. java run 方法_java线程中的run()方法能有几个啊?
  11. 关于websocket 在生产环境中遇到的问题 及 解决办法
  12. java水仙花数代码_java知识分享篇(五)
  13. HDU1847 Good Luck in CET-4 Everybody!【SG函数】
  14. shell直接退出后 后台进程关闭的原因和对处
  15. c语言自学教程——字符函数和字符串函数
  16. 删除微云同步助手计算机快捷访问,腾讯微云同步助手使用说明:设置同步文件,方便随时查看...
  17. HP惠普笔记本Microsoft ACPI-Compliant System未知设备的解决办法
  18. Python实现轮盘抽奖小程序(带界面)
  19. 9.foreign key(外键)
  20. weka的java环境配置_weka学习(安装和部署)

热门文章

  1. SpringCloud实战2-Ribbon客户端负载均衡
  2. python str转dict
  3. jq 中each的用法 (share)
  4. LAMP默认安装路径
  5. 如何让Jython自动加载一个Jar包
  6. 【Python笔记】datetime 模块用法
  7. PLSQL连接Oracle报错 ORA-12154 标识符
  8. eclipse默认项目部署路径(.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps) 改为自己的tomcat真实路径方法
  9. JavaWeb项目 打开首页就跳转debug模式的解决方法
  10. [转]Linux下VSCode常用的快捷键