У меня синхронизация блокировки, пожалуйста, помогите запустить цикл цикла - PullRequest
0 голосов
/ 09 марта 2012

все. Я написал код синхронизации в Java. Есть 2 класса, первый увеличивает число на 1000, второй увеличивает это число на 10. Процесс должен повториться 100 раз. Хотя я написал циклы цикла, они не работают.

Вот код:

public class thread
{
  static int count = 100;
  public static void main(String[] args) 
  {
    Thread thread1 = new Thread(new XThread());
    Thread thread2 = new Thread(new YThread());

    thread1.start();
    thread2.start();
    synchronized(thread2)
      {
        thread2.notify();
      }

  }
}
class XThread extends Thread {
  static long sum=0;

  static int i;
  synchronized public void run() {

    sum=5+1000;
    System.out.println(i+" "+"Thread 1"+" "+sum);

    {
      for(i= 0; i < lab5.count; i++)
        {
          try {
            {
              System.out.println("-----------");                
              this.wait();
            }



          } 
          catch (InterruptedException ex) 
            {
              sum=sum+1000;
              System.out.println(i+" "+"Thread 1"+" "+sum);
              notify();

            }
        }
    }

  }
}

class YThread extends Thread 
{
  static long sum;
  static int i;
  synchronized public void run() 
  {
    sum=5+10;
    System.out.println(YThread.i+" "+"Thread 2"+" "+YThread.sum);
    for(i=0; i < lab5.count; i++)
      {

        try 
          {
            {
              System.out.println("------------");
              this.wait();
            }

          } 

        catch (InterruptedException ex) 
          {
            sum=sum+10;
            System.out.println(YThread.i+" "+"Thread 2"+" "+YThread.sum);
            notify();

          }
      }
  }
}

1 Ответ

1 голос
/ 09 марта 2012

В вашем коде вы вызываете wait в run методе переопределения вашего потока.

К сожалению, никто не вызывает notify метод для объекта, который ожидает.

Этопотому что в вашем main вы переворачивали свои X и YThread в общий Thread объект.

Из-за этого вызов thread2.notify() отправляет сигнал не тому объекту (не YThread, который заблокирован, а объект-оболочка).

Измените объявление на

Thread thread1 = new XThread();
Thread thread2 = new YThread();

Ваша программа все еще будет блокироваться (потому что вы не notifying потоков достаточно много раз), но, по крайней мере, это может пойти дальше.Обратите внимание may в моем последнем предложении.Это связано с тем, что notify в thread2 может быть отправлен до того, как поток вызовет свой первый wait.

...