java代码实现两个线程,A线程打印0到50,B线程51到100
时间: 2023-12-29 21:52:08 浏览: 75
java程序员面试宝典
好的,这是一个典型的多线程问题。Java代码实现如下:
```java
public class Main {
private static Object lock = new Object();
private static int count = 0;
public static void main(String[] args) {
Thread threadA = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
while (count <= 50) {
System.out.println("Thread A: " + count++);
try {
lock.notifyAll();
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.notifyAll();
}
}
});
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
while (count >= 51 && count <= 100) {
System.out.println("Thread B: " + count++);
try {
lock.notifyAll();
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.notifyAll();
}
}
});
threadA.start();
threadB.start();
}
}
```
这个程序中,我们定义了一个共享的计数器变量 `count`,和一个共享的对象 `lock`。然后分别定义了两个线程 `threadA` 和 `threadB`,分别打印 `0~50` 和 `51~100` 之间的数字。
在 `run()` 方法中,我们先获得 `lock` 的锁,然后进入一个 `while` 循环,打印数字。注意必须使用 `synchronized` 块保证竞态条件的正确性。
每次打印一个数字后,我们调用 `lock.notifyAll()` 来唤醒其他线程,然后自己进入等待状态,等待其他线程唤醒自己。在被唤醒后,我们会重新检查计数器是否满足条件,如果满足,继续打印数字;否则,继续等待。
当线程退出循环后,我们必须调用 `lock.notifyAll()` 来确保其他线程都能够正确地退出等待状态。
综上所述,这个程序可以正确地实现两个线程的竞争条件,打印 `0~100` 之间的数字。
阅读全文