我应该在此代码中做哪些更改,以便两个线程一直到数组的末尾并打印其所有内容

What changes should I do in this code so that the two threads go till the end of the Array and print all of its content

我正在尝试打印数组中的所有数字,从索引 0 处的 1 开始,最后以 11 结束。 有两个线程正在执行此操作,一个仅打印偶数,第二个仅打印奇数。

这是代码。

class PrintEvenOdd {
      
    static class SourceData {
      
         int[] arr;
         volatile int counter;

         public SourceData(int[] commonArr, int counter){
           
             this.arr = commonArr;
             this.counter = counter;
         }

         public void getData(){
           try{
             synchronized(this){
                    
                 while((counter%2==0 && Thread.currentThread().getName().equalsIgnoreCase("odd")) || (counter%2!=0 && Thread.currentThread().getName().equalsIgnoreCase("even"))){
                    wait();
                 }

                 System.out.println(counter+ " : " + Thread.currentThread().getName());

                 notify();
             }
           }catch(Exception ie){
              ie.printStackTrace();
           }
         }

    }

    static class Even extends Thread{
      SourceData sd;

      public Even(SourceData sd){
          this.sd = sd;        
      }

      @Override
      public void run(){
        while(sd.counter < 12) {   
         sd.getData();
         sd.counter++;
        }
      }
    }

    static class Odd extends Thread{
      SourceData sd;
      

      public Odd(SourceData sd){
         this.sd = sd;
      }

      @Override
      public void run(){
        while(sd.counter < 12) {  
         sd.getData();
         sd.counter++;
        }
      }
    }

    public static void main(String[] args){
       int[] commonArr = new int[11];
       for(int i = 0; i < commonArr.length; i++){
         commonArr[i] = i;  
       }
       int counter = 0;
   
       SourceData sd = new SourceData(commonArr, counter);
         Even even = new Even(sd);
         even.setName("EVEN");
         even.start();
         Odd odd = new Odd(sd);
         odd.setName("ODD");
         odd.start();
    }
}

这段代码的问题在于它只打印了两个值,如图所示,

0 : EVEN
1 : ODD

我应该做哪些更改才能使代码打印数组末尾的所有值?

这是正在发生的事情:EVEN 运行,将计数器递增到 1,然后在接下来的 getData 中它开始等待。然后 ODD 运行,将计数器递增到 2,然后它也开始等待 getData。你有两个线程在等待,没有机会醒来。

要修复它,您必须在线程等待的条件发生变化时发出通知。即:在sd.counter++之后通知,这样其他线程才能唤醒。由于另一个线程正在等待 sd,您必须调用:

sd.counter++
sd.notify()

另请注意,ODD 和 EVEN 线程是相同的。您可以让一个 class 实现该线程,并创建它的两个实例。