JAVA:有两个线程,线程A负责对一个数据进行加法操作,线程B负责对这个数据进行减法操作。初始时数据为0。要求操作过程中始终保证数据的有效性,即在任意时刻都不能小于0。如果数据小于0,线程必须等待,直到数据变得可用。
时间: 2024-03-16 08:46:51 浏览: 39
这个问题可以使用Java中的同步机制来解决。可以使用synchronized关键字来同步对数据的访问,保证每次只有一个线程在对数据进行操作。
具体实现可以创建一个共享数据类,包含一个数字变量和两个同步方法add()和sub(),分别用于加法和减法操作。在每个方法中使用synchronized关键字来同步对数据的访问。在add()方法中,首先判断数据是否小于0,如果小于0则等待,直到数据变得可用。然后进行加法操作,并返回操作后的数据。在sub()方法中,同样首先判断数据是否小于0,如果小于0则等待,直到数据变得可用。然后进行减法操作,并返回操作后的数据。
下面是一个Java代码示例:
```java
class SharedData {
private int num = 0;
public synchronized int add(int x) throws InterruptedException {
while (num + x < 0) {
wait();
}
num += x;
notifyAll();
return num;
}
public synchronized int sub(int x) throws InterruptedException {
while (num - x < 0) {
wait();
}
num -= x;
notifyAll();
return num;
}
}
public class Main {
public static void main(String[] args) {
SharedData data = new SharedData();
Thread threadA = new Thread(() -> {
try {
int result = data.add(10);
System.out.println("Thread A: " + result);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread threadB = new Thread(() -> {
try {
int result = data.sub(5);
System.out.println("Thread B: " + result);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
threadA.start();
threadB.start();
}
}
```
在这个示例中,使用了wait()和notifyAll()方法来实现等待和通知的机制。在add()和sub()方法中,使用while循环来判断当前数据是否可用。如果不可用,则调用wait()方法使线程等待,直到数据变得可用。在操作完成后,调用notifyAll()方法来通知其他等待的线程。
在主函数中,创建了一个共享数据对象和两个线程。线程A调用add()方法进行加法操作,线程B调用sub()方法进行减法操作。由于使用了同步机制,可以保证每次操作都是原子性的,且数据始终有效。
阅读全文