java并行多线程同时拿一组数但是全都拿了第一个数要求每个线程拿不一样的数
时间: 2024-02-18 11:02:22 浏览: 23
要实现多个线程同时拿一组数,但每个线程拿到的数不一样,可以通过创建多个任务,每个任务负责处理一部分数,然后把多个任务提交到线程池中,让线程池中的线程同时处理这些任务。
具体步骤如下:
1. 创建一个线程池,可以使用 Java 自带的 Executors 工具类来创建线程池。
2. 把要处理的一组数分成若干份,每份由一个任务来处理。可以根据线程数来分配任务,每个任务负责处理一部分数。
3. 把这些任务提交到线程池中,线程池会自动创建若干个线程来处理这些任务。
4. 等待所有任务执行完成,可以使用线程池的 awaitTermination 方法来等待。
示例代码如下:
```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int numThreads = 4; // 线程数
int size = nums.length / numThreads; // 每个任务处理的数的个数
ExecutorService pool = Executors.newFixedThreadPool(numThreads);
for (int i = 0; i < numThreads; i++) {
int startIndex = i * size;
int endIndex = (i == numThreads - 1) ? nums.length : (i + 1) * size;
Runnable task = new MyTask(nums, startIndex, endIndex);
pool.execute(task);
}
pool.shutdown(); // 等待所有任务执行完成
while (!pool.isTerminated()) {}
System.out.println("All tasks are finished!");
}
}
class MyTask implements Runnable {
private int[] nums;
private int startIndex;
private int endIndex;
public MyTask(int[] nums, int startIndex, int endIndex) {
this.nums = nums;
this.startIndex = startIndex;
this.endIndex = endIndex;
}
@Override
public void run() {
for (int i = startIndex; i < endIndex; i++) {
// 处理 nums[i]
System.out.println(Thread.currentThread().getName() + ": " + nums[i]);
}
}
}
```
上述代码中,创建了一个包含四个线程的线程池,把要处理的十个数分成四份,每个任务处理两到三个数。然后把这些任务提交到线程池中,等待所有任务执行完成。每个任务的具体实现在 MyTask 类中实现,这里只是简单地输出任务要处理的数。