用Java编写一个程序,开启 3 个线程,去读取数组中的资源,要求读取 的数据不能重复
时间: 2023-11-27 09:49:46 浏览: 81
以下是一个可能的Java代码示例,其中有三个线程同时读取一个数组中的资源,并且确保不会重复读取相同的数据:
```java
import java.util.HashSet;
public class ReadThread implements Runnable {
private static final int[] data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
private static final HashSet<Integer> set = new HashSet<>();
private static int index = 0;
private final int id;
public ReadThread(int id) {
this.id = id;
}
@Override
public void run() {
while (true) {
int i;
synchronized (ReadThread.class) {
if (index >= data.length) {
break; // 所有数据都已经读取完毕
}
i = data[index];
index++;
}
synchronized (set) {
if (set.contains(i)) {
System.out.println("Thread " + id + " skipped " + i);
continue; // 已经读取过了,跳过
}
set.add(i);
}
System.out.println("Thread " + id + " read " + i);
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new ReadThread(1));
Thread t2 = new Thread(new ReadThread(2));
Thread t3 = new Thread(new ReadThread(3));
t1.start();
t2.start();
t3.start();
}
}
```
这个程序使用了一个静态的`data`数组来存储要读取的数据,以及一个静态的`set`集合来存储已经读取过的数据。每个线程都会不停地尝试读取`data`数组中的下一个元素,如果该元素已经在`set`集合中出现过,那么线程就会跳过该元素。这样可以确保每个数据只会被读取一次。在代码中,使用了`synchronized`关键字来确保多个线程之间的互斥访问。
阅读全文