/**
* 2019年8月8日16:05:05
* 目的:实现火车站卖票系统(第一种创建线程的方式)
* @author 张涛
*
*/ //第一种方式直接继承Thread来创建线程
class T1 extends Thread
{
//加static的原因是:每次new一个对象出来,该对象就会有一个tickets属性,这样的话就相当于卖2倍票数,当然错误
private static int tickets = 1000;
//加static的原因是:确定同步的是同一个str,原理同上。
static String str = new String ("start");
//重写run方法
public void run()
{
while(true)
{
synchronized(str)//同步代码块
{
if(tickets > 0)
{
System.out.printf("%s线程正在运行,第%d张票正在出售\n",Thread.currentThread().getName(),tickets);
tickets--;
}
} } }
} public class Ticket_1
{
public static void main(String[] args)
{
//两个对象,两个线程
T1 tic1 = new T1();
T1 tic2 = new T1(); tic1.start();
tic2.start();
}
}
 /**
* 2019年8月8日17:04:45
* 目的:实现火车站的卖票系统(第二种创建线程的方式)
* @author 张涛
*
*/ //创建线程的第二种方式
class T2 implements Runnable
{
/*相较于第一种创建线程的方式,
* 这里不需要加static,
* 因为该创建方式是同一个对象里面的不同线程,
* 第一种创建方式是不同对象的不同线程,
*/
private int tickets = 10000;
String str = new String ("start"); //重写run
public void run()
{
while(true)
{
//同步代码块
synchronized (str)
{
if(tickets > 0)
{
System.out.printf("%s线程正在运行,正在卖出剩余的第%d张票\n",Thread.currentThread().getName(),tickets);
/*
* 调用Thread类中的currentThread()方法到达当前线程,再通过getName()方法获取当前线程的名称
*/
tickets--;
}
}
}
}
} public class Ticket_2
{
public static void main(String[] args)
{
//构建T2的对象
T2 tt = new T2();
//用同一个对象构造里面的两个线程
Thread t1 = new Thread (tt);
Thread t2 = new Thread (tt);
t1.setName("南京站");
t2.setName("南京南站"); //开启线程
t1.start();
t2.start();
}
}

Java实现卖票程序(两种线程实现)的更多相关文章

  1. Java多线程练习:ticket卖票程序

    /*需求:简单的卖票程序多个窗口买票 */ class Ticket extends Thread{    private static int tick=100;    public void ru ...

  2. AsyncTask两种线程池

        AsyncTask两种线程池  http://bbs.51cto.com/thread-1114378-1.html (API 3.0以后): 1.THREAD_POOL_EXECUTOR, ...

  3. JAVA 集合 List 分组的两种方法

    CSDN日报20170219--<程序员的沟通之痛> [技术直播]揭开人工智能神秘的面纱 程序员1月书讯 云端应用征文大赛,秀绝招,赢无人机! JAVA 集合 List 分组的两种方法 2 ...

  4. Java中HashMap遍历的两种方式

    Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...

  5. java中数组复制的两种方式

    在java中数组复制有两种方式: 一:System.arraycopy(原数组,开始copy的下标,存放copy内容的数组,开始存放的下标,需要copy的长度); 这个方法需要先创建一个空的存放cop ...

  6. java动态获取WebService的两种方式(复杂参数类型)

    java动态获取WebService的两种方式(复杂参数类型) 第一种: @Override public OrderSearchListRes searchOrderList(Order_Fligh ...

  7. 在netty3.x中存在两种线程:boss线程和worker线程。

    在netty 3.x 中存在两种线程:boss线程和worker线程.

  8. Java使用SFTP和FTP两种连接方式实现对服务器的上传下载 【我改】

    []如何区分是需要使用SFTP还是FTP? []我觉得: 1.看是否已知私钥. SFTP 和 FTP 最主要的区别就是 SFTP 有私钥,也就是在创建连接对象时,SFTP 除了用户名和密码外还需要知道 ...

  9. 你创建线程池最好分为两种线程池,io密集型线程池,或者cpu密集型线程池

    你创建线程池最好分为两种线程池,io密集型线程池,或者cpu密集型线程池. 否则,如果只用一个线程池的话,不管是iO密集的线程,或者cpu消耗大的都放在同一个线程池的话,会发生线程池被撑满的情况

随机推荐

  1. 77.Q表达式详解

    Q表达式可以包裹查询条件,可以在多个条件之间进行操作:与或非等.Q表达式一般会放在filter()中进行使用,F表达式一般是放在update()中进行使用. 定义模型的models.py文件中,示例代 ...

  2. 六、CI框架之分配变量

    一.在controllers里面添加 $this->load->vars('m_Str1','我是一个字符串变量'); 二.在View中添加相应代码 界面显示效果如下: 不忘初心,如果您认 ...

  3. QSignalMapper is deprecated

    今天参考 qt4 的书籍,在 qt5 的平台上面,用了 QSignalMapper,结果收到警告" QSignalMapper is deprecated". 经过一番查找,找到了 ...

  4. php和js的小区别

    1.今天看了下php的api感觉还可以,不是很难,可能没看到深入的地方, (1)和js很相似 目前感觉它和js的最大区别 js的  点  被替换成 -> function setCate($pa ...

  5. Javascript声明和使用变量

    1.1变量的声明 要在程序中使用变量,就必须从声明变量学起,因为Javascript语法与我们基础的其他程序语言声明变量的方法略有不同,但是Javascript语法的变量应用非常强大,使用也非常简单. ...

  6. sql优化从300秒到7秒

    原始sql select b.jd 街道,b.rglm 楼宇,zzrl 楼宇编号,count(oname) 入楼企业总数, (select count(oname) from ${tablename} ...

  7. pycharm 的 使用 设置智能目录 Pycharm 断点跳转及 Step Over/Step Into/Step Out 等的区别

    pycharm  右键点击文件夹  有个mark directiory as  根据需要给目录进行设置 Pycharm调试程序时,有时需要直接从第一个断点跳转至第二个断点,如果还是用单步调试的话就非常 ...

  8. 【2017西安邀请赛:A】XOR(线段树+线性基)

    前言:虽然已经有很多题解了,但是还是想按自己的理解写一篇. 思路:首先分析题目 一.区间操作 —— 线段树 二.异或操作 —— 线性基 这个两个不难想,关键是下一步的技巧 “或”运算 就是两个数的二进 ...

  9. 吴裕雄--天生自然MySQL学习笔记:MySQL 排序

    从 MySQL 表中使用 SQL SELECT 语句来读取数据. 如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回 ...

  10. iris数据集预测

    iris数据集预测(对比随机森林和逻辑回归算法) 随机森林 library(randomForest) #挑选响应变量 index <- subset(iris,Species != " ...