基本上我试图用一个线程每秒发送一条广播消息,然后等待另一个线程的回答。事情是我似乎无法使我的代码正确,所以我做了一个小例子,它会做同样的事情,运行两个线程,一个在另一个修改某个变量时停止。这是:
public class test {
public static void main(String[] args){
test2 t = new test2();
}
}
public class test2 {
private volatile Opponent b = new Opponent();
public test2(){
new Thread(new Runnable(){
public void run(){
synchronized(this){
while(!b.a){
for(int i = 0; i < 100; i ++){
System.out.println(i);
try{
this.wait(1000);
}catch(InterruptedException ie){
}
}
}
}
}
}).start();
new Thread(new Runnable(){
public void run(){
synchronized(this){
for(int i = 0; i < 100; i ++){
System.out.println(i*100);
if(i*100 == 200){
b.a = true;
System.out.println("true");
}
try{
this.wait(1000);
}catch(InterruptedException ie){
}
}
}
}
}).start();
}
}
public class Opponent {
static boolean a = false;
public Opponent(){
}
}
我的问题是,如果我执行同步(this),线程会运行,但b.a永远不会更新,循环会永远继续。如果我做同步(b),我得到一个IllegalMonitorException。
我做错了什么?
由于
答案 0 :(得分:1)
字段Opponent.a
必须为volatile
,因为它是正在修改的变量。在发布的代码中,volatile
适用于test2.b
,仅在分配给Opponent
的新test2.b
个实例时才有用。 volatile
上的test2.b
无用,可以替换为final
,因为它不会更改。
请注意,由于Opponent.a
是static
,Opponent
的实例实际上并不需要构建。
更正示例:
// First thread loop condition.
//
while(!Opponent.a) {
// Second thread assignment.
//
Opponent.a = true;
public class Opponent
{
static volatile boolean a = false;
}