博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java实现多线程的四种实现方式
阅读量:6828 次
发布时间:2019-06-26

本文共 3612 字,大约阅读时间需要 12 分钟。

以计算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
> 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
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
> 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
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
> a = new ArrayList<>(threadSize); for (int i = 0; i < threadSize; i++) { final int ii = i; a.add(new RecursiveTask
() { @Override protected 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
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();}}

转载地址:http://rwykl.baihongyu.com/

你可能感兴趣的文章
利用 TensorFlow 入门 Word2Vec
查看>>
组成 TensorFlow 核心的六篇论文
查看>>
从django的SECRET_KEY到代码执行
查看>>
一个轮子搞定 Fragment 和状态栏那些事
查看>>
leetcode 686. Repeated String Match 题解
查看>>
java 操作符详解
查看>>
SpringBoot整合Dubbo2.5.10
查看>>
【ES6基础】const介绍
查看>>
使用Java Socket手撸一个http服务器
查看>>
node-sass安装失败的究极解决方法与简单使用
查看>>
单例模式
查看>>
网易云轻舟微服务深度解读:基于开源,强于开源
查看>>
不轻松,服务器部署nginx+uwsgi+djangorestfremework+react
查看>>
亚洲第一届 Rust 大会将于 4 月 20 日在 [北京] 开启
查看>>
AFNetworking2.0
查看>>
TiDB 源码阅读系列文章(二)初识 TiDB 源码
查看>>
七年切图仔如何面试大厂web前端?(沟通软技能总结) | 掘金技术征文
查看>>
Express 实战(七):视图与模板:Pug 和 EJS
查看>>
学习OpenGL ES之透视和正交投影
查看>>
node的process以及child_process
查看>>