簡體   English   中英

同時運行兩個線程

[英]Run two thread concurrently

我正在同時嘗試兩個打印兩個線程的名稱。 任何人都可以暗示,我在做什么錯? 我收到“ IllegalMonitorStateException

// ODD THREAD RUNNABLE公共類OddThread實現Runnable {

    MainClass obj;
    public OddThread(MainClass obj) {
        // TODO Auto-generated constructor stub
        this.obj= obj;
    }
    public void run() {
        int number=1;
        while(number <10)
        {
          obj.PrintNumbers();
          notifyAll();
          try {
            wait();
        } catch (InterruptedException e) {System.out.println("Exception in wait of OddThread");
        }
          number = number+2;

        }

    }

}

//甚至線程可運行

public class EvenThread implements Runnable{

    MainClass obj;
    public EvenThread(MainClass obj)
    {
        this.obj=obj;
    }
    public void run() {
        int number=0;
        while(number<=10)
        {
          obj.PrintNumbers();
          notifyAll();
          try {
            wait();
        } catch (InterruptedException e) {
            System.out.println("Exception in wait of EvenThread");
        }
       number = number+2;
        }

    }

}

//主類

public class MainClass {
   public static void main(String[] args)
   {
       MainClass obj = new MainClass();
      // Boolean flag= true;
       EvenThread evenThread = new EvenThread(obj);
       OddThread oddThread = new OddThread(obj);
       Thread Even = new Thread(evenThread);
       Thread Odd = new Thread(oddThread);
       Even.setName("Even Thread");
       Odd.setName("Odd Thread");
       Even.start();
       Odd.start();
   }

   public synchronized void PrintNumbers()
   {
       System.out.println(Thread.currentThread().getName());
   }

}

我得到的輸出是線程“偶數線程”中的偶數線程奇數線程異常線程“奇數線程”中的偶數線程異常java.lang.IllegalMonitorStateException

您應該將notifyAll()wait() notifyAll()synchronized (this) {}例如:

synchronized (this) {
    notifyAll();
}

synchronized (this) {
    wait();
}

這些方法notify()notifyAll()wait()只能由作為此對象的監視器的所有者的線程調用,因此您必須將它們包圍在一個同步塊中,如此處所說的Object Java doc

這是正確的代碼:

public class MainClass {
    public static int number=0;
   public static void main(String[] args)
   {
       MainClass obj = new MainClass();
      // Boolean flag= true;
       EvenThread evenThread = new EvenThread(obj);
       OddThread oddThread = new OddThread(obj);
       Thread Even = new Thread(evenThread);
       Thread Odd = new Thread(oddThread);
       Even.setName("Even Thread");
       Odd.setName("Odd Thread");
       Even.start();
       Odd.start();
   }

   public synchronized void PrintNumbers()
   {  
       while(number<20)
       {
           System.out.println(number+"---"+Thread.currentThread().getName());
           number++;
           notifyAll();

           try {
            wait();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

       }
   }

}




public class OddThread implements Runnable {


    MainClass obj;
    public OddThread(MainClass obj) {
        // TODO Auto-generated constructor stub
        this.obj= obj;
    }
    public void run() {

          obj.PrintNumbers();


    }

}



public class EvenThread implements Runnable{

    MainClass obj;
    public EvenThread(MainClass obj)
    {
        this.obj=obj;
    }
    public void run() {
        int number=0;

          obj.PrintNumbers();


    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM