# Java多线程+分治求和，太牛了

shigen坚持更新文章的博客写手，擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长，分享认知，留住感动。

### java版归并排序

public class MergeSortDemo {

// 归并排序
static void mergeSort(int[] arr, int left, int right) {

if (left < right) {

int mid = (left + right) / 2;
// 简直直接mid
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}

private static void print(int[] arr) {

for (int i = 0; i < arr.length; i++) {

System.out.print(arr[i] + " ");
}
System.out.println();
}

private static void merge(int[] arr, int left, int mid, int right) {

// 构建一个临时数组暂存arr[left, right]之间有序的元素
int[] temp = new int[right - left + 1];
int i = left, j = mid + 1, k = 0;

// while的临界条件需注意，此时分段有序数组合并
// [1,2,3] + [1,3,4,5,6] mid = 4
while (i <= mid && j <= right) {

if (arr[i] < arr[j]) {

temp[k++] = arr[i++];
} else {

temp[k++] = arr[j++];
}
}
// 剩下的元素直接追加即可，两个while只会走一个
while (i <= mid) {

temp[k++] = arr[i++];
}
while (j <= right) {

temp[k++] = arr[j++];
}

// 将temp[] => arr[left, right]
for (i = 0; i < temp.length; i++) {

arr[left + i] = temp[i];
}
}

public static void main(String[] args) {

int[] arr = {

1, 432, 1, 3243, 54, 32, -10, 43, 90};
mergeSort(arr, 0, arr.length - 1);
print(arr);
}

}


### python版归并排序

• 1-1_0000
• 1_0001-2_0000
• 2_0001-3_0000
• ……
• 9999_0000-10000_0000

### 多线程求和

public class ThreadPoolDemo {

@SneakyThrows
public static void main(String[] args) {

int[] arr = new int[10_0000];
for (int i = 0; i < arr.length; i++) {

arr[i] = i + 1;
}

StopWatch stopWatch = new StopWatch();
stopWatch.start();

int sum = 0;
int chunkSize = arr.length / 10;

for (int i = 0; i < 10; i++) {

int start = i * chunkSize;
int end = (i == 9) ? arr.length : (start + chunkSize);
sum += executor.submit(new SumTask(arr, start, end)).get();
}

executor.shutdown();
stopWatch.stop();
System.out.println("Sum of 1 to 100000 is: " + sum);

}
}

private final int[] arr;
private final int start;
private final int end;

public SumTask(int[] arr, int start, int end) {

this.arr = arr;
this.start = start;
this.end = end;
}

@Override
public Integer call() {

int sum = 0;
for (int i = start; i < end; i++) {

sum += arr[i];
}
return sum;
}
}


for (int i = 0; i < 10; i++) {

int start = i * chunkSize;
int end = (i == 9) ? arr.length : (start + chunkSize);
sum += executor.submit(new SumTask(arr, start, end)).get();
}


### 多线程+分治求和

public class SumRecursive {

public static class RecursiveSumTask implements Callable<Long> {

// 拆分粒度
public static final int THRESHOLD = 10_0000;
int low;
int high;
int[] arr;
ExecutorService executorService;

RecursiveSumTask(ExecutorService executorService, int[] arr, int low, int high) {

this.executorService = executorService;
this.arr = arr;
this.low = low;
this.high = high;
}

@Override
public Long call() throws Exception {

long result = 0;
if (high - low < THRESHOLD) {

for (int i = low; i < high; i++) {

result += arr[i];
}
} else {

int mid = (low + high) / 2;
result = lr.get() + rr.get();
}
return result;
}
}

@SneakyThrows
public static void main(String[] args) {

int[] arr = new int[10000_0000];
for (int i = 0; i < arr.length; i++) {

arr[i] = i + 1;
}

StopWatch stopWatch = new StopWatch();
stopWatch.start();

executorService.shutdown();
stopWatch.stop();
System.out.println("Sum of 1 to 100000 is: " + result);

}

}


|
3天前
|

【5月更文挑战第20天】 在多核处理器日益普及的今天，并发编程成为了软件开发中不可忽视的重要话题。Java语言提供了丰富的并发工具和机制来帮助开发者构建高效且线程安全的应用程序。本文将探讨Java并发的核心概念，包括线程同步、锁机制、以及如何通过这些工具实现性能优化。我们将透过实例分析，揭示并发编程中的常见问题，并展示如何利用现代Java API来解决这些问题。
11 0
|
3天前
|

【5月更文挑战第20天】在Java并发编程中，线程安全和性能优化是两个关键要素。本文将深入探讨Java并发编程的基本概念、线程安全的实现方法以及性能优化技巧。通过分析同步机制、锁优化、无锁数据结构和并发工具类的使用，我们将了解如何在保证线程安全的前提下，提高程序的性能。
9 0
|
3天前
|

【5月更文挑战第20天】 在Java开发中，正确处理并发问题对于确保应用的稳定性和提高性能至关重要。本文将深入探讨Java并发编程的核心概念——线程安全，以及如何通过各种技术和策略实现它，同时保持甚至提升系统性能。我们将分析并发问题的根源，包括共享资源的竞争条件、死锁以及线程活性问题，并探索解决方案如同步机制、锁优化、无锁数据结构和并发工具类等。文章旨在为开发者提供一个清晰的指南，帮助他们在编写多线程应用时做出明智的决策，确保应用的高效和稳定运行。
14 1
|
1天前
|
Java 调度
【JAVA学习之路 | 提高篇】线程的通信
【JAVA学习之路 | 提高篇】线程的通信
|
1天前
|

【JAVA学习之路 | 提高篇】线程安全问题及解决
【JAVA学习之路 | 提高篇】线程安全问题及解决
|
1天前
|
Java
|
1天前
|
Java 调度
|
1天前
|
Java 开发者
Java并发编程：理解线程同步和锁
【5月更文挑战第22天】本文将深入探讨Java并发编程的核心概念——线程同步和锁。我们将从基本的同步问题开始，逐步深入到更复杂的并发控制技术，包括可重入锁、读写锁以及Java并发工具库中的其他锁机制。通过理论与实例相结合的方式，读者将能够理解在多线程环境下如何保证数据的一致性和程序的正确性。
10 3
|
1天前
|
Java 程序员
Java中的多线程编程

|
2天前
|
Java 容器
Java并发编程：深入理解线程池
【5月更文挑战第21天】 在多核处理器的普及下，并发编程成为了提高程序性能的重要手段。Java提供了丰富的并发工具，其中线程池是管理线程资源、提高系统响应速度和吞吐量的关键技术。本文将深入探讨线程池的核心原理、关键参数及其调优策略，并通过实例展示如何高效地使用线程池以优化Java应用的性能。
14 3