问题补充说明:class Hy implements Runnable{ private int ticket = 0 ; public void setTicket(int ticket){ this.ticket = ticket; } public int getTicket(){ return this.ticket; } public void run(){ ***.fun(); } public synchronized void fun(){ for(int x=0;x<20000;x++){ if(this.ticket>0){ try{ Thread.sleep(30); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "窗口卖票" + this.ticket--); } } }}public class StringBufferDemo01{ public static void main(String args[]){ Hy t1 = new Hy(); int ticket = 10; System.out.println("开始卖票,总票张数为:" + ticket ); t1.setTicket(ticket); Thread d1 = new Thread(t1,"A"); Thread d2 = new Thread(t1,"B"); Thread d3 = new Thread(t1,"C"); d1.start(); d2.start(); d3.start(); }}此道程序为什么只启动d1线程 其它两个均未启动
问题在于线程1进入同步方法后要把票卖完后才退出,其它线程无法进入此同步方法,当线程1卖完票后,其它线程进入,但是已经没有票卖了。
我给你改了下:
packagetest;
classHyimplementsRunnable
{
privateintticket=0;
publicvoidsetTicket(intticket){
this.ticket=t360问答icket;
}
publicintgetTicket(){
returnthis.ticket;
}
publicvoidrun(){
while(true){
***.fun();
}
}
publicsynchronizedvoidfun(){
for(intx=0;x<20000;x++){
if(thi沿王酒煤衡转半该只套s.ticket>0){
try{
Thread.sleep(30);
}catch(InterruptedExceptione){
e.printS其述其息队频朝散到tackTrace();
}
System.out.p黑出罪色将倒环rintln(Thread.currentThread(相校便表益刻花).getName()+"窗口卖票"+this.ticket--);
}
错break;
}
}
吸耐}
publicclassTest
{
publicstaticvoidmain(Stringargs[]){
Hyt1三差站验若战毛=newHy();
intticket=10;
System.out.println("开始卖票,总票张数为:"+ticket);
t1.setTicket(ticket);
Threadd1=newThread(t1,"A");
Threadd2=newThread(t1,"B");
Threadd3=newThread(t1,"C");
d1.start();
d2.start();
d3.start();
}
}
标签:java,线程