【问题标题】:Problem with Synchronization . App just freezes同步问题。应用程序只是冻结
【发布时间】:2019-02-19 03:48:34
【问题描述】:

我在同步对象方面遇到问题,需要您的帮助。我正在创建一个游戏,但我无法让同步线程工作。我正在尝试创建 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();
    }
}
}

【问题讨论】:

  • 你马上在两把锁上等待。如果两个线程都在等待,它们怎么能做任何事情?
  • 我试图在最后添加 lock1.notify() 但它不起作用。这只是一个测试活动。我试图在通知和同步方面做得更好,以便我可以在我的应用程序中使用它们。谢谢你的回答
  • 如果有人看到这个我还有一个问题:有没有办法像无限循环一样互相通知,如何启动它。因为我尝试在最后通知并没有任何反应......
  • 您想将wait() 与条件循环结合使用。例如,创建一个由lock1 保护的boolean。对wait() 使用循环,而booleanfalse。整个循环应该在synchronized 块内。当您希望线程终止时,获取锁,将boolean 设置为true,然后在锁上调用notifyAll()。为lock2 做同样的事情。

标签: java android multithreading synchronized notify


【解决方案1】:

而不是使用两个不同的锁使用单个锁,在这里我设置了一个检查(布尔标志),以便 t1 总是首先设置文本。我已经使用条件 while(1==1) 使 wait() 和 notify() 以无限顺序进行,您可以将自己的条件停止。我希望这会有所帮助。

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

【讨论】:

    猜你喜欢
    • 2016-03-19
    • 1970-01-01
    • 2010-09-18
    • 2016-02-22
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    相关资源
    最近更新 更多