入参为一个整型数组(Integer[] input),要求对入参(input)按奇偶数分成两个数组,要求启动两个线程,分别将入参(input)中的奇数和偶数输出到一个文件中,需要偶数线程每打印10个偶数以后,就将奇数线程打印10个奇数,如此交替进行。同时需要记录输出进度,每完成1000个数就在控制台中打印当前完成数量,并在所有线程结束后,在控制台打印“Done”
使用生产者,消费者模式,通过wait,notifyall通知线程实现。
public class Test {
private static final Object lock = new Object();
volatile private static boolean flag = true;
public static void main(String[] args) throws Throwable {
new Thread(() -> {
int num = 0;
while (num < 2000) {
synchronized (lock) {
while (!flag) {
try {
lock.wait();
} catch (InterruptedException e) {
}
}
for (int i = 0; i < 10; i++, num += 2) {
System.out.print(num + " ");
}
System.out.println();
flag = false;
lock.notifyAll();
}
}
}).start();
new Thread(() -> {
int num = 1;
while (num < 2000) {
synchronized (lock) {
while (flag) {
try {
lock.wait();
} catch (InterruptedException e) {
}
}
for (int i = 0; i < 10; i++, num += 2) {
System.out.print(num + " ");
}
System.out.println();
flag = true;
lock.notifyAll();
}
}
}).start();
}
}
可以参考一下。
public class InputSpace {
private Integer[] arrEven;
private Integer[] arrOdd;
private int evenNum;
private int oddNum;
private int num;
public Integer[] getArrEven() {
return arrEven;
}
public Integer[] getArrOdd() {
return arrOdd;
}
public int getNum() {
return num;
}
public InputSpace() {
Random random = new Random();
List<Integer> listEven =new ArrayList<>();
List<Integer> listOdd =new ArrayList<>();
int num;
for (int i = 0; i < 1000 ; i++) {
if((num = random.nextInt(100) ) % 2 == 0) {
listEven.add(num);
}else {
listOdd.add(num);
}
}
arrEven = new Integer[listEven.size()];
listEven.toArray(arrEven);
arrOdd =new Integer[listOdd.size()];
listOdd.toArray(arrOdd);
}
synchronized public void printEven(){
if (evenNum % 10 == 0 && evenNum != 0){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i < 10; i++) {
System.out.println("打印第" + (evenNum + 1) + "个偶数"+ arrEven[evenNum]);
evenNum++;
num++;
}
if(num % 1000 == 0 && num !=0){
System.out.println("Done");
}
notifyAll();
}
public int getEvenNum() {
return evenNum;
}
public int getOddNum() {
return oddNum;
}
synchronized public void printOdd(){
if (oddNum % 10 == 0 && oddNum != 0 ){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i < 10 ; i++) {
System.out.println("打印第" + (oddNum + 1) + "个奇数"+ arrOdd[oddNum]);
oddNum++;
num++;
}
if(num % 1000 == 0 && num !=0){
System.out.println("Done");
}
notifyAll();
}
}
public class PrintEven extends Thread {
private InputSpace inputSpace;
public PrintEven(InputSpace inputSpace) {
this.inputSpace = inputSpace;
}
@Override
public void run() {
while(inputSpace.getNum() < 10000){
if(inputSpace.getArrEven().length == inputSpace.getEvenNum()){
System.out.println("偶数已打完");
return;
}
inputSpace.printEven();
}
}
}
public class PrintOdd extends Thread{
private InputSpace inputSpace;
public PrintOdd(InputSpace inputSpace) {
this.inputSpace = inputSpace;
}
@Override
public void run() {
while(inputSpace.getNum() < 10000){
if(inputSpace.getArrOdd().length == inputSpace.getOddNum()){
System.out.println("奇数已打完");
return;
}
inputSpace.printOdd();
}
}
}
public class Test4 {
public static void main(String[] args) {
InputSpace inputSpace = new InputSpace();
PrintEven printEven = new PrintEven(inputSpace);
PrintOdd printOdd = new PrintOdd(inputSpace);
System.out.println(inputSpace.getArrEven().length);
System.out.println(inputSpace.getArrOdd().length);
printEven.start();
printOdd.start();
}
}
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632