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



我在同步对象上遇到麻烦,我需要您的帮助。我正在创建一个游戏,无法让同步线程工作。我正在尝试创建2个线程,每次更改文本视图时互相通知。您可以帮助我吗?预先感谢您。这是我的代码:

   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();
    }
}
}

而不是使用两个不同的锁使用一个锁,在这里我放了一个检查(布尔标志),以便t1始终将文本始终设置。我已经使用了条件(1 == 1)以无限序列制作wait(1 == 1)和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();
    }
}
}

最新更新