public class ThreadSyncDemo2{
public static void main(String []args){
ThreadTest t=new ThreadTest();
new Thread(t).start();
new Thread(t).start();
}
}
class ThreadTest implements Runnable{
private int tickets=100;
public void run(){
while(true){
synchronized(this){
if(tickets>0){
try{
Thread.sleep(3000);
}
catch(Exception e){
System.out.println(e.getMessage());
}
System.out.println(Thread.currentThread().getName()+"正在买第"+tickets--+"号票");
}
}
}
}
}
问题:执行中,两个线程是不断交替运行的,但是我在代码中怎么没找到使县城交替运行的代码?难道线程的交替是默认完成的?

解决方案 »

  1.   

    public static void main(String []args){
    ThreadTest t=new ThreadTest();
    new Thread(t).start();
    new Thread(t).start();
    }
    }
    中,俩个new Thread(t).start()就说明了两个线程是不断交替运行的.
      

  2.   

    因为thread时启动后是相互竞争的关系,也就是说线程间竞争启动,而Thread.sleep(3000);是暂停本线程,以便其他线程有机会启动
      

  3.   

    问题的关键在
    synchronized(this)
    第一个线程锁定了当前对象
    第二个线程执行到这里的时候就暂停下来等待当前对象解锁之后才继续运行
    而在第一个线程执行完成之后,tickets也就递减到0了
    第二个线程中的代码条件不满足,不再输出信息
    去掉synchronized(this)这句之后
    就可以看到所谓的线程交互运行的情况了
      

  4.   

    1、 去掉synchronized(this)后,两个线程的输出貌似是同时刷出来的,sleep(3000)只执行了一次,可是有两个线程调用run(),那么sleep(3000)也应该被调用两次吧,那么两个线程输出结果时,应该有间隔吧?
    2、 sleep(3000)在run()中是写在println()之前的,与线程交替运行好像没有什么关系吧。
    3、 最困惑的问题:第一个线程执行完run()后,线程是什么状态?它为什么要等待第二个线程执行run()后才继续执行run()?第一个线程为什么不一直使自己run下去?
      

  5.   

    To haisenmai(我应该做的到):
               孙鑫的视频?在哪里能下的到?
      

  6.   

    1、 去掉synchronized(this)后,两个线程的输出貌似是同时刷出来的,sleep(3000)只执行了一次,可是有两个线程调用run(),那么sleep(3000)也应该被调用两次吧,那么两个线程输出结果时,应该有间隔吧?
    2、 sleep(3000)在run()中是写在println()之前的,与线程交替运行好像没有什么关系吧。
    3、 最困惑的问题:第一个线程执行完run()后,线程是什么状态?它为什么要等待第二个线程执行run()后才继续执行run()?第一个线程为什么不一直使自己run下去?各位大虾,HELP!!