package com.test;

 public class SaleTickets implements Runnable
 {
     private int ticketCount = 10;// 总的票数
     Object mutex = new Object();// 锁

     /**
      * 卖票
      */
     public void sellTicket()
     {
         synchronized (mutex)// 当操作的是共享数据时,
                         // 用同步代码块进行包围起来,这样在执行时,只能有一个线程执行同步代码块里面的内容
         {
             if (ticketCount > 0)
             {
                 ticketCount--;
                 System.out.println(Thread.currentThread().getName()
                         + "正在卖票,还剩" + ticketCount + "张票");
             }
             else
             {
                 System.out.println("票已经卖完!");
                 return;
             }
         }
     }

     public void run()
     {
         while (ticketCount > 0)// 循环是指线程不停的去卖票
         {
             sellTicket();
             /**
              * 在同步代码块里面睡觉,和不睡效果是一样 的,作用只是自已不执行,也不让线程执行
              * 所以把睡觉放到同步代码块的外面,这样卖完一张票就睡一会,让其他线程再卖,这样所有的线程都可以卖票
              */
             try
             {
                 Thread.sleep(100);
             }
             catch (InterruptedException e)
             {
                 e.printStackTrace();
             }
         }
     }
 }

下面是调用

 package com.test;

 public class TicketMain
 {

     public static void main(String[] args)
     {
         SaleTickets runTicekt = new SaleTickets();
         Thread th1 = new Thread(runTicekt, "窗口1");
         Thread th2 = new Thread(runTicekt, "窗口2");
         Thread th3 = new Thread(runTicekt, "窗口3");
         Thread th4 = new Thread(runTicekt, "窗口4");
         th1.start();
         th2.start();
         th3.start();
         th4.start();
     }

 }

执行效果:

Java多线程卖票例子的更多相关文章

  1. 对于JAVA多线程卖票小程序的理解

    昨天把多线程重新看了一遍,发现自己还是有许多需要理解的地方,现在写一篇总结. 一:利用继承Thread类会出现的问题: public class SellTicketsThread extends T ...

  2. Java实现卖票程序(两种线程实现)

    /** * 2019年8月8日16:05:05 * 目的:实现火车站卖票系统(第一种创建线程的方式) * @author 张涛 * */ //第一种方式直接继承Thread来创建线程 class T1 ...

  3. Java多线程基础知识例子

    一.管理 1.创建线程 Thread public class Main { public static void main(String[] args) { MyThread myThread = ...

  4. Java 多线程 socket 取款例子 runnable callable

    socket部分参考 http://blog.csdn.net/kongxx/article/details/7259465 取款部分参考 http://blog.csdn.net/dayday198 ...

  5. java多线程的常见例子

    收藏 http://blog.csdn.net/wenzhi20102321/article/details/52524545

  6. Java多线程_复习(更新中!!)

    java多线程的常见例子 一.相关知识: Java多线程程序设计到的知识: (一)对同一个数量进行操作 (二)对同一个对象进行操作 (三)回调方法使用 (四)线程同步,死锁问题 (五)线程通信 等等 ...

  7. java多线程—Runnable、Thread、Callable区别

    多线程编程优点 进程之间不能共享内存,但线程之间共享内存非常容易. 系统创建线程所分配的资源相对创建进程而言,代价非常小. Java中实现多线程有3种方法: 继承Thread类 实现Runnable接 ...

  8. Java多线程同步和异步问题

    我们首先来说一下多线程: 多线程很形象的例子就是:在一个时刻下,一个班级的学生有人在拖地,有人在擦窗户,有人在擦桌子 按照单线程程序,肯定是先去拖地,再去擦窗户,再去擦桌子.但是在多线程就好像他们在一 ...

  9. Java多线程——线程范围内共享变量

    多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. package java_ ...

随机推荐

  1. 深入剖析通知中心和KVO

    深入剖析通知中心和KVO 要先了解KVO和通知中心,就得先说说观察者模式,那么观察者模式到底是什么呢?下面来详细介绍什么是观察者模式. 观察者模式 -A对B的变化感兴趣,就注册成为B的观察者,当B发生 ...

  2. 全局响应MotionEvent

    遇到这样一个需求:应用无论处于哪个view controller,摇动手机,都能够出发某一方法. 能够想到的思路就是用苹果封装好的“MotionEvent”,但是如果简单的把一下代码加到某一view ...

  3. python-list tuple dict set

    1:删除一个列表末尾的元素 pop方法 >>> a [1, 'Jack', 2, 3, 2] >>> a.pop() >>> a [1, 'Jac ...

  4. SqlServer--代码创建约束

    约束-保证数据完整性先用设计器创建约束,再用代码创建约束.数据库约束是为了保证数据的完整性(正确性)而实现的一套机制非空约束 (选择复选框)not null主键约束(PK)primary key co ...

  5. 使用Attribute校验对象属性数据是否合法

    一.前言 说来惭愧,做了几年ASP.NET最近才有机会使用MVC开发生产项目.项目中新增.编辑表单提交存在大量服务端数据格式校验,各种if else显得代码过于繁琐,特别是表单数据比较多的时候尤为恶心 ...

  6. JavaScript:内存泄露、性能调优

    1.在进行JS内存泄露检查之前,先要了解JS的内存管理: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Manageme ...

  7. SQL Server 2008 R2——CROSS APPLY 根据数据出现的次数和时间来给新字段赋值

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  8. PHP笔记(PHP中级篇)

    初级了解PHP的语法,中级就要学习PHP操作DateBase以及各种复杂的实现了! 文件系统处理 作用: 项目需要 长时间保存数据 服务器中文件操作 特点 都是使用系统函数完成的 基于Linux/Un ...

  9. redis 配置

    一 Redis 支持写的指令 Redis大概的命令如下:set setnx setex appendincr decr rpush lpush rpushx lpushx linsert lset r ...

  10. MVVM中数据验证之 ViewModel vs. Model

                                                      MMVM模式示意图. View绑定到ViewModel,然后执行一些命令在向它请求一个动作.而反过来 ...