java 多线程处理同一批数据Demo
时间: 2023-09-25 12:13:13 浏览: 156
下面是一个 Java 多线程处理同一批数据的 demo:
```java
import java.util.ArrayList;
import java.util.List;
public class MultiThreadDemo {
private static final int THREAD_COUNT = 4;
private static final int DATA_SIZE = 1000000;
public static void main(String[] args) throws InterruptedException {
// 初始化数据
List<Integer> data = new ArrayList<>(DATA_SIZE);
for (int i = 0; i < DATA_SIZE; i++) {
data.add(i);
}
// 创建线程
List<Thread> threads = new ArrayList<>(THREAD_COUNT);
for (int i = 0; i < THREAD_COUNT; i++) {
final int startIndex = i * DATA_SIZE / THREAD_COUNT;
final int endIndex = (i + 1) * DATA_SIZE / THREAD_COUNT;
Thread thread = new Thread(() -> {
// 处理数据
for (int j = startIndex; j < endIndex; j++) {
process(data.get(j));
}
});
threads.add(thread);
}
// 启动线程
for (Thread thread : threads) {
thread.start();
}
// 等待线程执行完成
for (Thread thread : threads) {
thread.join();
}
// 统计结果
int result = 0;
for (int i = 0; i < DATA_SIZE; i++) {
result += data.get(i);
}
System.out.println("Result: " + result);
}
private static void process(int data) {
// TODO: 实现数据处理的逻辑
}
}
```
在这个例子中,我们初始化了一个包含 1000000 个整数的列表,然后创建了 4 个线程来处理这些数据。每个线程处理的数据是均匀分配的,即第 1 个线程处理索引为 0 到 249999 的数据,第 2 个线程处理索引为 250000 到 499999 的数据,以此类推。在每个线程中,我们调用了 `process` 方法来处理数据。
在主线程中,我们启动了所有的线程,并等待它们执行完成。然后我们统计了所有数据的和,输出了结果。
需要注意的是,在多线程处理同一批数据时,需要注意线程之间的同步问题。例如,如果 `process` 方法有副作用,可能会出现数据竞争的问题,导致结果不正确。可以使用 synchronized 或者 Lock 等机制来解决这个问题。
另外,多线程处理同一批数据的效率并不一定比单线程处理快,因为线程之间的切换和同步也会带来一定的开销。因此,在实际应用中,需要根据具体情况来选择最合适的方案。
阅读全文