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

以计算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>() {
                @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<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

时间: 2024-11-01 21:52:57

Java实现多线程的四种实现方式的相关文章

Java线程池的四种创建方式

Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待. newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行. newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保

Java实现多线程的四种方式

Java多线程实现方式主要有四种: *①继承Thread类. *②实现Runnable接口. *③实现Callable接口通过FutureTask包装器来创建Thread线程. *④使用ExecutorService.Callable.Future实现有返回结果的多线程. 1.继承Thread类创建线程Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例.启动线程的唯一方法就是通过Thread类的start()实例方法.start()方法是一个native方法,它将启动

XML解析——Java中XML的四种解析方式

 XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四种:1.DOM解析:2.SAX解析:3.JDOM解析:4.DOM4J解析.其中前两种属于基础方法,是官方提供的平台无关的解析方式:后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台. 针对以下XML文件,会对四种方式进行详细描述: 1 <?xml version="1.

黑马程序员——XML解析---java中XML的四种解析方式

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四种:1.DOM解析:2.SAX解析:3.JDOM解析:4.DOM4J解析.其中前两种属于基础方法,是官方提供的平台无关的解析方式:后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于jav

java基础——多线程的两种实现方式

第一种实现方式:继承Thread类,并实现run方法,这种情况下每个线程对象都有一个独立的run方法 package thread; /* @author zsben @create 2020-01-03 9:52 多线程创建的第一种方法:继承于Thread类 1.创建一个继承于Thread的类 2.重写Thread类的run方法-->将此线程执行的操作声明在run中 3.创建Thread子类对象 4.通过此对象调用start方法:启动当前线程,调用当前线程的run方法 */ //1.创建一个继

5.6-全栈Java笔记:内部类的四种实现方式

一般情况,我们把类定义成独立的单元.有些情况下,我们把一个类放在另一个类的内部定义,称为内部类(innerclasses). 内部类的作用 1.内部类提供了更好的封装.只能让外部类直接访问,不允许同一个包中的其他类直接访问. 2.内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员. 但外部类不能访问内部类的内部属性. 内部类的使用场合 由于内部类提供了更好的封装特性,并且可以很方便的访问外部类的属性.所以,通常内部类在只为所在外部类提供服务的情况下优先使用. 内部类的分类 成员内部类

java中多线程的两种创建方式

一丶继承Thread类实现多线程 第一步:继承Thread类第二步:重写run()方法第三步:创建继承了Thread类的对象 , 调用start()方法启动. //线程创建方式一 : /* 第一步:继承Thread类 第二步:重写run()方法 第三步:创建继承了Thread类的对象 , 调用start()方法启动. */ public class TestThread extends Thread{ @Override public void run() { for (int i = 0; i

多线程的四种创建方式--前两种不常用

- (void)viewDidLoad { [super viewDidLoad]; //1.Datach 方式,隐式创建 //    [NSThread detachNewThreadSelector:@selector(detachMethod) toTarget:self withObject:nil]; //2.NSObject的perform方法,隐式创建 //    [self performSelectorInBackground:@selector(detachMethod) w

Java中XML的四种解析方式(二)

三.JDOM解析 特征: 1.仅使用具体类,而不使用接口. 2.API大量使用了Collections类. 1 import org.jdom2.Attribute; 2 import org.jdom2.Document; 3 import org.jdom2.Element; 4 import org.jdom2.JDOMException; 5 import org.jdom2.input.*; 6 import java.io.*; 7 import java.util.ArrayLis