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

Posted weiyinfu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
}
}

以上是关于Java实现多线程的四种实现方式的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程的四种实现方式

JAVA多线程实现的四种方式

多线程实现的四种方式

Java多线程实现的四种方式

Java多线程实现的四种方式

java线程实现的四种方式