问题描述
publicclassThreadDemo3{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubThreadTest2test2=newThreadTest2();newThread(test2).start();//这个线程调用同步代码块//让主线程暂停一会儿try{Thread.sleep(1);}catch(Exceptione){//TODO:handleexceptionSystem.out.println(e.getMessage());}test2.str="method";newThread(test2).start();//这个线程调用同步函数}}publicclassThreadTest2implementsRunnable{privateinttickets=100;Stringstr=newString("");publicvoidrun(){//TODOAuto-generatedmethodstubif(str.equals("method")){while(true){sale2();}}else{synchronized(this){if(tickets>0){try{Thread.sleep(10);}catch(Exceptione){//TODO:handleexceptionSystem.out.println(e.getMessage());}}System.out.println(Thread.currentThread().getName()+"issalingticket"+tickets--);}}}publicsynchronizedvoidsale2(){if(tickets>0){try{Thread.sleep(10);}catch(Exceptione){//TODO:handleexceptionSystem.out.println(e.getMessage());}System.out.print("test:");System.out.println(Thread.currentThread().getName()+"issalingticket"+tickets--);}}}
解决方案
解决方案二:
你的run()方法里的else分支里没有加while(true),所以进入else分支后只会运行一次,应该改为else{while(true){synchronized(this){if(tickets>0)...}//endsynchronized}//endwhile}//endwhile
解决方案三:
解决方案四:
引用1楼ProgramMonkey2014的回复:
你的run()方法里的else分支里没有加while(true),所以进入else分支后只会运行一次,应该改为else{while(true){synchronized(this){if(tickets>0)...}//endsynchronized}//endwhile}//endwhile
楼上正解