按要求编写Java语言程序,实现如下功能: 从标准输入stdin中读取两个正整数m和n, 然后开启n个线程,每个线程【依次轮流】输出【一个数字】和【自己的线程编号】到标准输出stdout, 所有线程输出的结果数列a的前m项。 数列a的定义为:a(1)=2347,a(2)=3917,a(k)=[a(k-1)^2 + 9337*a(k-2) + 6047] mod 10000 例如,m=100,n=2的情况,就是两个线程x和y交替输出。线程x输出2347,然后线程y输出3917,然后线程x输出a(3)即9673,然后线程y输出a(4)即9807……直到线程x输出a(99)的值、线程y输出a(100)的值后程序结束。
时间: 2023-03-22 11:01:19 浏览: 103
以下是Java语言程序的实现:
```java
import java.util.Scanner;
public class Main {
private static final int[] a = new int[100];
static {
a[0] = 2347;
a[1] = 3917;
for (int i = 2; i < 100; i++) {
a[i] = (a[i - 1] ^ 29337) * a[i - 2] % 10000;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
int n = scanner.nextInt();
Thread[] threads = new Thread[n];
for (int i = 0; i < n; i++) {
threads[i] = new Thread(new PrintNumber(i));
}
for (int i = 0; i < m; i++) {
int j = i % n;
synchronized (threads[j]) {
threads[j].notify();
}
try {
synchronized (threads[j]) {
threads[j].wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static class PrintNumber implements Runnable {
private final int id;
private int index = 0;
public PrintNumber(int id) {
this.id = id;
}
@Override
public void run() {
while (index < 100) {
synchronized (this) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(a[index] + " " + id);
index++;
notify();
}
}
}
}
}
```
程序的思路是:首先预先计算好数列a的前100项,然后创建n个线程,每个线程有一个唯一的编号id。然后使用wait和notify来实现线程间的同步输出。具体来说,主线程循环m次,每次循环会选择第j个线程输出数列a的第j项。主线程首先通过notify方法唤醒第j个线程,然后通过wait方法等待该线程的输出完成。而第j个线程则在运行时通过wait方法等待主线程的唤醒,然后输出对应的数列a的值,最后再通过notify方法唤醒主线程继续循环。
阅读全文