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