多线程演示:两个线程《卖票》

/*

 * 用两个线程进行:卖票

 *

 * 同步函数用的是哪一个锁呢?

 * 函数需要被对象调用,那么函数都有一个所属对象引用。就是this.

 * 所以同步函数使用的锁是this.

 *

 * 如何找问题:

 * 1,明确哪些代码是多线程运行代码

 * 2,明确共享数据

 * 3,明确多线程运行代码中哪些语句是操作共享数据的。、

 */

class Ticket implements Runnable

{

    //将票私有500张票

    private int tick = 500;

   

    //定义一个标记,用来切换两个线程

    boolean flag = true;

   

    //覆盖runnable中的run方法

    public void run()

    {

       if(flag)

       {

           //打印车票

           while(true)

           {

             

              //如果show方法被静态修饰,这里调用的对象是Ticket.class

              synchronized(this)//因为run方法调用的show()方法,show方法调用的是this.所以这里是this

              {

                  if(tick>0)

                  {

                     try{Thread.sleep(10);}catch(Exception e){}

                     System.out.println(Thread.currentThread().getName()+"同步售票"+tick--);

                  }

              }

           }

       }

       else

           while(true)

              show();

    }

   

    //对操作共享数据的代码块进行封装

    public synchronized void show()

    {

       if(tick>0)

       {

           try{Thread.sleep(10);}catch(Exception e){}

           //currentThread();获取线程名称

           System.out.println(Thread.currentThread().getName()+"..同步函数售票.."+tick--);

       }

    }

   

}

public class _08线程同步 {

   

    public static void main(String[]args)

    {

       Ticket t = new Ticket();

      

       //创建线程

       Thread t1 = new Thread(t);

       Thread t2 = new Thread(t);

      

       t1.start();

      

      

       //当主函数执行到这儿时,让它停留10;原因是,main主函数线程会瞬间将两个线程开启执行,

       //所以当线程执行到t.falg=false时,会直接执行到show方法

       try{Thread.sleep(10);}catch(Exception e){}

       t.flag = false;

       t2.start();

      

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值