javaSE基础编程——线程同步(模拟火车站售票操作)


用多线程模拟火车站的售票操作。
   a.售票总数为100张车票
   b.由四个窗口(线程)模拟售票
   线程休眠1秒钟售一张火车票.
   要求:同步块,同步方法。


package com.cissst.software.synthread;

public class MainThread {

 /**
  * @param args
  * 5.用多线程模拟火车站的售票操作。
     *   a.售票总数为100张车票
     *   b.由四个窗口(线程)模拟售票
     * 线程休眠1秒钟售一张火车票.
  *  要求:同步块,同步方法0
  */
 public static void main(String[] args) {
  
  //创建子线程对象
  SicketThreadMethod sicket = new SicketThreadMethod();//下面用到两种实现线程同步的方法,二者选其一即可,用哪个就创建哪个子线程对象
  
  //启动四个窗口进行售票操作
        Thread t1 = new Thread(sicket,"窗口一");
        Thread t2 = new Thread(sicket,"窗口二");
        Thread t3 = new Thread(sicket,"窗口三");
        Thread t4 = new Thread(sicket,"窗口四");
       
        t1.start();
        t2.start();
        t3.start();
        t4.start();
 }

}


//用到同步代码块

package com.cissst.software.synthread;

/**
 * 模拟火车站售票操作
 * 线程同步操作
 * @author Administrator
 * @date2015-8-10
 *
 */
public class SicketThread implements Runnable {

 //售票总数
 private int count = 100;
 //创建同步代码块的锁对象(任意对象)
 Object lock = new Object();
 /**
  * 实现窗口售票
  */
 @Override
 public void run() {
  while(count > 0){
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }

//同步代码块
   synchronized(lock){    
    if(count > 0){
     System.out.println(Thread.currentThread().getName()+
       "正在售第" + count + "张车票");
     //售完一张车票,剩余总票数减一
     count --;
    }
   }
  }

 }

}


//用到同步方法

package com.cissst.software.synthread;

/**
 * 模拟火车站售票操作
 * 线程同步操作
 * @author Administrator
 * @date2015-8-10
 *
 */
public class SicketThreadMethod implements Runnable {

 //售票总数
 private int count = 100;
 /**
  * 实现窗口售票
  */
 @Override
 public void run() {
  while(count > 0){
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   sellTicket();
  }

 }
 
 /**
  * 模拟售票操作
  * 同步方法: 方法的声明中加入synchronized关键字
  */
 public synchronized void sellTicket(){
  if(count > 0){
   System.out.println(Thread.currentThread().getName()+
     "正在售第" + count + "张车票");
   //售完一张车票,剩余总票数减一
   count --;
  }
 }

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值