0

我正在尝试实现信号量等共享变量的情况。因为我有 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……

4

2 回答 2

3

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

好吧,您不是按顺序运行 - 您是在同时运行三个,这就是您启动三个单独线程时发生的事情的本质。

这些线程根本没有相互同步。考虑到您的要求,听起来您根本不应该拥有三个线程。

此外:

  • 你没有任何synchronized障碍;两者wait()notify()只能由拥有调用它们的监视器的线程调用
  • 强烈建议不要在 of 的实例上使用wait()和,因为内部使用它自己。我建议你创建一个单独的对象只是为了同步/等待/通知。notify()ThreadThread
  • 您的异常处理完全忽略了异常,它一直在向您隐藏第一个问题。永远不要忽视异常——一般来说,尽量避免裸露Exception
于 2013-10-02T19:46:24.647 回答
1

调用notify()andwait()里面的run()方法基本上就是调用

this.notify();

每个实例上都没有您Thread的 s 。synchronizedthis Thread

如果您notify()不拥有显示器,则不能,即。synchronized在上面。你正在吞下所有你得到的例外。

于 2013-10-02T19:46:10.260 回答