我正在尝试实现一个像信号量这样的共享变量的例子。在那我有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 ......
答案 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}}就可以了。 您吞下了所有例外情况。