2017-10-11 50 views
0

我试图使用两个不同的线程打印偶数和奇数。有人能指出我犯的错误吗? 目前,这是输出的样子:我使用2个线程实现甚至奇数打印甚至是10的问题

奇数:1

要等待1

通知2

要等待2

请找到下面的代码:

public class EvenOdd { 
     public static void main(String[] args) {   
      PrintEvenOdd p1=new PrintEvenOdd(false); 
      PrintEvenOdd p2=new PrintEvenOdd(true); 
      p1.start(); 
      p2.start();   
     } 
    }  
class PrintEvenOdd extends Thread{  
    boolean isEven; 
    boolean isOdd=true; 

    public PrintEvenOdd(boolean e) { 
     isEven=e; 
    } 

    public synchronized void run() { 
      if(isEven) { 
      for(int i=2;i<=10;i+=2) 
      { 
       while(isOdd) { 
        try { 
         System.out.println("going to wait 1"); 
         wait(); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
       System.out.println("Even: "+i); 
       isOdd=true; 
       System.out.println("notify 1"); 
       notifyAll(); 

      } 
      } 
      if(!isEven) { 
      for(int i=1;i<=10;i+=2) { 
       while(!isOdd) { 
        try { 
         System.out.println("going to wait 2"); 
         wait(); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
       System.out.println("Odd: "+ i); 
       isOdd=false; 
       System.out.println("notify 2"); 
       notifyAll(); 
      } 
     } 
    } 
} 

回答

1

作为您的主要想法r算法对我来说不是很明确,我只想指出你可以尝试自行修复的bug &在哪里。

当您一个接一个地开始线程时:p1.start(); p2.start();它们的执行顺序与我们开始时的顺序相同。

当第一个线程调用同步方法void run()时,比锁定显示器的方式为PrintEvenOdd.class。这意味着第二个线程将等待,直到第一个释放监视器(说不会执行任何一行代码)。

由第一线程执行的调试器进一步去流,你会看到下面的操作:

  • 下拉到if(!isEven)条件
  • 期间i=1循环迭代
  • 期间i=2去无休止wait()设置isOdd=false循环迭代

作为wait操作当两个线程都被挂起时,ion不会释放您正在获取的类监视器。