我遇到了同步对象的问题,我需要你的帮助。我正在创建一个游戏,我无法让同步的线程工作。我正在尝试创建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();
}
}
}
而不是使用两个不同的锁使用单个锁,这里我放了一个检查(布尔标志),以便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();
}
}
}