public class TicketsSystem { /**
 * @param args
 */
public static void main(String[] args) {
// TODO 自动生成方法存根
SellTickets st=new SellTickets();
new Thread(st).start();
try
{
Thread.sleep(1);
}
catch(Exception e)
{
e.printStackTrace();
}
st.b=true;
new Thread(st).start();

}}
class SellTickets implements Runnable
{
int tickets=100;
Object obj=new Object();
boolean b=false;
public void run()
{
if(b==false)
{
while(true)
{
sell();
}
}
else
{
while(true)
{
synchronized(obj)
{ if(tickets>0)
{
try{
Thread.sleep(10);
}catch(InterruptedException e)
{
e.getStackTrace();
}
System.out.println("obj:"+Thread.currentThread().getName()+"sell tickets:"+tickets);
tickets--;
}
}
}
}


}
public synchronized void sell()
{
if(tickets>0)
{
try
{
Thread.sleep(10);
}catch(Exception e)
{
e.getStackTrace();
}
System.out.println("sell:"+Thread.currentThread().getName()+"sell tickets:"+tickets);
tickets--;
}

}
}我本意想叫2个线程分别进入同步方法和同步块同时打印,可是结果是只在同步快里打印,不知道何故
望高手赐教应该怎么改。。多谢多谢

解决方案 »

  1.   

    同一个对象的同步方法(或者同步块)在同一时间,只能有一个同步方法在执行。
    st.b=true;这以后,
    if(b==false)就不成立了,所以就有你看到的现象。执行else的代码了。
      

  2.   

    一般的理解应该是第一个线程new Thread(st).start();之后,就调用这个线程的run()方法,因为bt.t=false,所以应该调用sell()同步方法,但是在创建并启动第一个线程的时,main()方法所在的线程的时间片并没有完,所以第一个线程并没有执行,也就是没有调用run()方法,所以主程继续向下执行,当执行完bt.b=true;后,创建第二个线程,这是main()方法所在的线程的时间片已结束,所以这是第二线程开始执行,调用run()方法,因为此时bt.b=true,所以执行同步块,同步方法永远也执行不了了!
    不知道说清楚没有啊!
      

  3.   

    我用你的程序没有改动编译运行   实现了你的目的
    郁闷
    是不是你用的IDE出问题了