实现3个类:Storage、Counter和Printer。 Storage类应存储整数。 Counter应创建线程,线程从0开始计数(0,1,2,3…)并将每个值存储到Storage类中。 Printer类应创建一个线程,线程读取Storage类中的值并打印值。编写程序创建Storage类的实例,并创建一个Counter对象和Printer对象操作此实例。添加适当代码,以确保每个数字都恰好只被打印一次
时间: 2024-02-13 19:04:38 浏览: 93
JAVA多线程运用
4星 · 用户满意度95%
以下是实现3个类的Java代码:
```java
public class Storage {
private int value;
private boolean hasValue = false;
public synchronized void setValue(int value) throws InterruptedException {
while (hasValue) {
wait();
}
this.value = value;
hasValue = true;
notifyAll();
}
public synchronized int getValue() throws InterruptedException {
while (!hasValue) {
wait();
}
int result = value;
hasValue = false;
notifyAll();
return result;
}
}
public class Counter implements Runnable {
private Storage storage;
public Counter(Storage storage) {
this.storage = storage;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
storage.setValue(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Printer implements Runnable {
private Storage storage;
private Set<Integer> printedValues = new HashSet<>();
public Printer(Storage storage) {
this.storage = storage;
}
@Override
public void run() {
while (printedValues.size() < 10) {
try {
int value = storage.getValue();
if (!printedValues.contains(value)) {
System.out.println(value);
printedValues.add(value);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) {
Storage storage = new Storage();
Counter counter = new Counter(storage);
Printer printer = new Printer(storage);
new Thread(counter).start();
new Thread(printer).start();
}
}
```
在以上代码中,Storage类表示一个存储整数的类,它有一个值和一个布尔变量hasValue表示是否有值。setValue方法用于设置值,如果已经有值则等待,否则设置值并通知其他线程。getValue方法用于获取值,如果没有值则等待,否则获取值并通知其他线程。
Counter类实现了Runnable接口,用于创建计数器线程。它从0开始计数10个整数,并将每个整数存储到Storage类中。
Printer类实现了Runnable接口,用于创建打印机线程。它从Storage类中读取值,并打印每个值,确保每个值只被打印一次。
Main类用于创建Storage类的实例,并创建一个Counter对象和Printer对象,分别用于操作此实例。Counter和Printer对象被分别封装在Thread对象中,并启动线程。
阅读全文