用两个线程和一个共享变量广播和回答

时间:2014-05-08 15:20:57

标签: java multithreading variables shared

基本上我试图用一个线程每秒发送一条广播消息,然后等待另一个线程的回答。事情是我似乎无法使我的代码正确,所以我做了一个小例子,它会做同样的事情,运行两个线程,一个在另一个修改某个变量时停止。这是:

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。

我做错了什么?

由于

1 个答案:

答案 0 :(得分:1)

字段Opponent.a必须为volatile,因为它是正在修改的变量。在发布的代码中,volatile适用于test2.b,仅在分配给Opponent的新test2.b个实例时才有用。 volatile上的test2.b无用,可以替换为final,因为它不会更改。

请注意,由于Opponent.astaticOpponent的实例实际上并不需要构建。

更正示例:

// First thread loop condition.
//
while(!Opponent.a) {

// Second thread assignment.
//
Opponent.a = true;

public class Opponent
{   
    static volatile boolean a = false;
}