java编写程序:有两个线程,线程A负责对一个数据进行加法操作,线程B负责对这个数据进行减法操作。初始时数据为0。要求操作过程中始终保证数据的有效性,即在任意时刻都不能小于0。如果数据小于0,线程必须等待,直到数据变得可用。
时间: 2024-02-01 16:13:07 浏览: 59
可以使用Java中的synchronized关键字和wait()、notify()方法来实现线程间的同步和通信。
具体实现如下:
```java
public class ThreadTest {
private static int data = 0;
public static void main(String[] args) {
Thread threadA = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
synchronized (ThreadTest.class) {
if (data >= 0) {
data++;
System.out.println("ThreadA: add, data = " + data);
try {
ThreadTest.class.notifyAll();
ThreadTest.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
try {
ThreadTest.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
});
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
synchronized (ThreadTest.class) {
if (data > 0) {
data--;
System.out.println("ThreadB: subtract, data = " + data);
try {
ThreadTest.class.notifyAll();
ThreadTest.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
try {
ThreadTest.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
});
threadA.start();
threadB.start();
}
}
```
上述代码中,使用了一个静态变量data作为共享数据,线程A和B分别对它进行加法和减法操作。在每次操作完成后,通过notifyAll()方法通知另一个线程可以执行操作,并调用wait()方法等待另一个线程执行完毕。
使用synchronized关键字可以保证同一时刻只有一个线程能够访问临界区的代码,从而避免了数据竞争问题。而wait()和notifyAll()方法则用于线程间的通信,保证了数据的有效性。
阅读全文