java 编写四个线程两个线程打印1-52的整数,另两个线程打字母印A-Z. 整体打印数字和字母的顺序没有要求,要求分别单独看数字,单独看字母为升序排列的 每个数字和字母之间用空格隔开 不要求两个线程轮流打
时间: 2024-02-23 09:02:31 浏览: 72
下面是一个可能的 Java 解决方案:
```java
public class PrintNumberAndLetter {
private static final Object lock = new Object();
private static boolean isNumberThreadRunning = true;
private static int number = 1;
private static char letter = 'A';
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
while (true) {
synchronized (lock) {
if (!isNumberThreadRunning) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (number > 52) {
break;
}
System.out.print(number + " ");
number++;
isNumberThreadRunning = false;
lock.notifyAll();
}
}
});
Thread t2 = new Thread(() -> {
while (true) {
synchronized (lock) {
if (isNumberThreadRunning) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (letter > 'Z') {
break;
}
System.out.print(letter + " ");
letter++;
isNumberThreadRunning = true;
lock.notifyAll();
}
}
});
Thread t3 = new Thread(() -> {
while (true) {
synchronized (lock) {
if (!isNumberThreadRunning) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (number > 52) {
break;
}
System.out.print(number + " ");
number++;
isNumberThreadRunning = false;
lock.notifyAll();
}
}
});
Thread t4 = new Thread(() -> {
while (true) {
synchronized (lock) {
if (isNumberThreadRunning) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (letter > 'Z') {
break;
}
System.out.print(letter + " ");
letter++;
isNumberThreadRunning = true;
lock.notifyAll();
}
}
});
t1.start();
t2.start();
t3.start();
t4.start();
try {
t1.join();
t2.join();
t3.join();
t4.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println();
}
}
```
解释一下代码:
首先定义了一个共享锁和一个共享变量 `isNumberThreadRunning`,表示当前是否应该打印数字。另外定义了一个数字变量 `number` 和一个字母变量 `letter`,分别表示当前应该打印的数字和字母。
然后创建了四个线程,两个线程打印数字,两个线程打印字母。在打印数字的线程中,先判断当前是否应该打印数字,如果不是则等待,否则打印数字并将 `isNumberThreadRunning` 设置为 `false`,通知其他线程。在打印字母的线程中,先判断当前是否应该打印字母,如果是则打印字母并将 `isNumberThreadRunning` 设置为 `true`,通知其他线程。两个打印字母的线程和两个打印数字的线程的代码类似,这里只说明一个。
最后等待所有线程结束,输出换行符。这个程序可以保证数字和字母分别单独看是升序排列的,但整体打印的顺序是不确定的。另外,由于打印数字和字母的线程函数是分别运行的,所以可能会有数字和字母连在一起打印的情况,需要注意。
阅读全文