使用wait-notify,我的方法有什么不对

时间:2013-10-02 19:44:08

标签: java multithreading wait notify

我正在尝试实现一个像信号量这样的共享变量的例子。在那我有3个线程应该顺序运行。以下是我的计划。你能告诉我哪里错了吗?

class Test2{    
    private volatile static int sharedvarNEXT = 1;
    public synchronized static int getSharedvarNEXT(){
        return sharedvarNEXT;   
    }
    public synchronized static void setSharedvarNEXT(int val){
        sharedvarNEXT = val;    
    }
    public static void main(String[] s){
        new classACaps().start();
        new classAsmall().start();
        new class1().start();
    }
}

class classACaps extends Thread{
    public void run(){
        try{
            for(char c='A';c<='Z';c++){
                if(Test2.getSharedvarNEXT() == 1){
                    System.out.println(c);
                    Test2.setSharedvarNEXT(2);
                    notify();
                } else {
                    wait();
                }
            }
        } catch(Exception e){
            System.out.println("caught in A");      
        }
    }
}

class classAsmall extends Thread{  
    public void run(){
        try{
            for(char c='a';c<='z';c++){
                if(Test2.getSharedvarNEXT() == 2){
                    System.out.println(c);      
                    Test2.setSharedvarNEXT(3);
                    notify();
                } else {
                    wait();
                }
            }
        } catch(Exception e){
            System.out.println("caught in a");      
        }
    }
}

class class1 extends Thread{
    public void run(){
        try{
            for(int c=1;c<=26;c++){
                if(Test2.getSharedvarNEXT() == 3){
                    System.out.println(c);
                    Test2.setSharedvarNEXT(1);
                    notify();
                }else {
                    wait();
                }
            }
        } catch(Exception e){
            System.out.println("caught in 1");      
        }
    }
}
  

预期结果如:A,a,1,B,b,2 ......

2 个答案:

答案 0 :(得分:3)

  

因为我有3个线程,应该按顺序运行。

嗯,你顺序运行 - 你同时运行这三个,这是你启动三个独立线程时发生的事情的性质。

这些线程没有在所有中相互同步。根据您的要求,听起来根本不应该有三个线程。

此外:

  • 您没有任何synchronized块; wait()notify()只能由拥有监视器的线程调用
  • 强烈建议不要在wait()的实例上使用notify()Thread,因为Thread的内部使用它自己。我建议您创建一个单独的对象只需来同步/等待/通知。
  • 您的异常处理完全忽略了异常,该异常一直隐藏着您的第一个问题。 从不忽略该异常 - 并且总体上试图避免仅仅使用Exception

答案 1 :(得分:1)

notify()方法中调用wait()run()基本上是在调用

this.notify();

Thread synchronized个实例中,this的所有Thread都不是notify()

如果您不拥有显示器,则不能synchronized,即。 {{1}}就可以了。 您吞下了所有例外情况。