Проблема с синхронизацией. Приложение просто зависает
У меня проблемы с синхронизированными объектами, и мне нужна ваша помощь. Я создаю игру, и я не могу заставить работать синхронизированные потоки. Я пытаюсь создать 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 ответ
Вместо того, чтобы использовать две разные блокировки, используйте одну блокировку, здесь я поставил галочку (логический флаг), чтобы 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();
}
}
}