Проблема с синхронизацией.Приложение просто зависает - PullRequest
0 голосов
/ 19 февраля 2019

У меня проблемы с синхронизированными объектами, и мне нужна ваша помощь.Я создаю игру, и я не могу заставить работать синхронизированные потоки. Я пытаюсь создать 2 потока, которые уведомляют друг друга каждый раз, когда они меняют textView. Можете ли вы мне помочь?Заранее спасибо. Это мой код:

   public void doPattern(int i) {

    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (lock1) {
                    try {
                        lock1.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
            }
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            tv.setText(text.get(0));
            synchronized (lock2) {
                lock2.notify();

            }
        }
    });
    Thread t2 = new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (lock2) {
                    try {
                        lock2.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
            }
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            tv.setText(text.get(1));

            synchronized (lock1) {
                lock1.notify();

            }
        }
    });
    t1.start();
    t2.start();
    try {
        t1.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    try {
        t2.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
}

1 Ответ

0 голосов
/ 20 февраля 2019

Вместо использования двух разных блокировок используйте одну блокировку, здесь я поставил галочку (логический флаг), чтобы t1 всегда устанавливал текст первым.Я использовал условие while (1 == 1), чтобы сделать wait () и notifiy () в бесконечной последовательности, вы можете поставить свое собственное условие для остановки.Я надеюсь, что это поможет.

volatile boolean flag=false;
public void doPattern(int i) {

    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
          synchronized (lock) 
          {

              flag =true;
              while(1==1)
               {   
                 try {
                      sleep(1000);
                     } catch (InterruptedException e) {
                      e.printStackTrace();
                     } 

                   tv.setText(text.get(0));
                   lock.notify();

                  try{ 
                    lock.wait();
                     }catch (InterruptedException e) {
                     e.printStackTrace();
                     }
                }
         }
    }});

    Thread t2 = new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (lock) {
                 if(!flag)
                  {
                    try {
                        lock.wait();
                        } catch (InterruptedException e) {
                          e.printStackTrace();
                        }
                  }     
            while(1==1)
               {
                     try {
                        sleep(1000);
                         } catch (InterruptedException e) {
                           e.printStackTrace();
                         }
                     tv.setText(text.get(1));
                     lock.notify();
                     try {
                        lock.wait();
                        } catch (InterruptedException e) {
                          e.printStackTrace();
                        }
           }
        }
    }});

    t1.start();
    t2.start();

    try {
        t1.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    try {
        t2.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
}
...