2. 编写一个程序,开启3个线程,去读取数组中的资源,要求读取的数据不能重复 数组: public static int[] arr ={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}; main方法格式: public class ReadArray{ public static void main(String[] args) { } } 输出示例: 线程1:读取1 线程2:读取3 线程3:读取4, 线程1:读取6 线程2:读取2 线程3:读取5,
时间: 2023-07-27 22:32:07 浏览: 58
好的,以下是一个Java程序,开启3个线程,去读取数组中的资源,要求读取的数据不能重复,输出示例与上述要求一致:
```java
public class ReadArray {
public static int[] arr = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30};
public static int index = 0; // 当前已经读取的下标
public static Object lock = new Object(); // 用于同步的锁对象
public static void main(String[] args) {
Thread thread1 = new Thread(new ReadThread(1));
Thread thread2 = new Thread(new ReadThread(2));
Thread thread3 = new Thread(new ReadThread(3));
thread1.start();
thread2.start();
thread3.start();
}
static class ReadThread implements Runnable {
private int id;
public ReadThread(int id) {
this.id = id;
}
@Override
public void run() {
while (true) {
synchronized (lock) {
if (index >= arr.length) { // 如果已经读取完毕,则退出
break;
}
int value = arr[index];
if (value % 3 == id - 1) { // 如果读取到了该线程负责的数据,则输出
index++;
System.out.print("线程" + id + ":读取" + value);
if (index < arr.length) {
System.out.print(", ");
}
}
}
}
}
}
}
```
这个程序首先定义了一个静态数组 `arr`,表示要读取的资源,以及一个静态的 `index`,表示当前已经读取的下标。在 `main` 方法中,创建了三个线程,并启动它们。
线程的实现在 `ReadThread` 类中,它实现了 `Runnable` 接口。在 `run` 方法中,首先通过同步代码块锁定了一个共享的锁对象 `lock`,然后判断是否已经读取完毕。如果已经读取完毕,则退出循环。否则,获取当前下标对应的值,并判断是否是该线程负责读取的数据。如果是,则输出该值,并将 `index` 加 1。输出时需要注意末尾不要输出逗号。
这样,就可以实现多线程读取数组中的资源,并保证读取的数据不重复。
阅读全文