用java编写有两个线程,线程A负责对一个数据进行加法操作,线程B负责对这个数据进行减法操作。初始时数据为0。要求操作过程中始终保证数据的有效性,即在任意时刻都不能小于0。如果数据小于0,线程必须等待,直到数据变得可用。
时间: 2024-02-01 16:13:09 浏览: 75
可以使用Java中的synchronized关键字和wait()/notify()方法来实现线程间同步和互斥。
具体实现如下:
```java
public class AddSubtractThreadDemo {
private static int data = 0;
public static void main(String[] args) {
Thread threadA = new Thread(new AddThread());
Thread threadB = new Thread(new SubtractThread());
threadA.start();
threadB.start();
}
static class AddThread implements Runnable {
@Override
public void run() {
synchronized (AddSubtractThreadDemo.class) {
while (true) {
// 判断数据是否小于0,如果小于0,则等待
while (data < 0) {
try {
AddSubtractThreadDemo.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 执行加法操作
data++;
System.out.println("Thread A: add 1, data = " + data);
// 唤醒其他等待线程
AddSubtractThreadDemo.class.notifyAll();
}
}
}
}
static class SubtractThread implements Runnable {
@Override
public void run() {
synchronized (AddSubtractThreadDemo.class) {
while (true) {
// 判断数据是否小于0,如果小于0,则等待
while (data < 0) {
try {
AddSubtractThreadDemo.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 执行减法操作
data--;
System.out.println("Thread B: subtract 1, data = " + data);
// 唤醒其他等待线程
AddSubtractThreadDemo.class.notifyAll();
}
}
}
}
}
```
在这个例子中,我们使用了一个静态变量data来表示数据,并且在两个线程中使用了同一个监视器对象AddSubtractThreadDemo.class来进行同步和互斥。在循环中,使用了while循环来判断数据是否小于0,如果小于0,则线程等待,直到其他线程执行完后唤醒自己。在加法和减法操作完成后,使用notifyAll()方法唤醒其他等待线程。这样可以保证数据的有效性,同时避免了死锁的出现。
阅读全文