线程问题,如何实现奇偶数数量不同的输出问题

入参为一个整型数组(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