同步问题。应用程序只是冻结

问题描述 投票:0回答:1

我遇到了同步对象的问题,我需要你的帮助。我正在创建一个游戏,我无法让同步的线程工作。我正在尝试创建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();
    }
}
}
java android multithreading synchronized notify
1个回答
0
投票

而不是使用两个不同的锁使用单个锁,这里我放了一个检查(布尔标志),以便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();
    }
}
}
© www.soinside.com 2019 - 2024. All rights reserved.