/**
* 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. 十七、CI框架之数据库操作insert用法

    一.代码如下: 二.我们访问一下页面 三.查看数据库,已经插入了一条数据 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦,谢谢.

  2. 菜鸟理解Lamdba表达式

    简单的说就是Java 1.8后给出个简化代码的方式, Java面向对象过分强调必须通过对象的形式来完成任务,而函数思想则尽量忽略面向对象的复杂语法,强调做什么,而不是以什么形式做. 举个栗子! 首先创 ...

  3. 第二阶段scrum-3

    1.整个团队的任务量: 2.任务看板: 会议照片: 产品状态: 前端制作完成,数据库正在配置

  4. html 鼠标样式 鼠标悬停 小手样式

    在style中添加cursor:pointer 实现鼠标悬停变成小手样式 先来一个示例 <div style="float:right"> <a class=&q ...

  5. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring Bean的生命周期

    Spring 容器可以管理 singleton 作用域 Bean 的生命周期,在此作用域下,Spring 能够精确地知道该 Bean 何时被创建,何时初始化完成,以及何时被销毁. 而对于 protot ...

  6. python counter、闭包、generator、解数学方程、异常

    1.counter 2.闭包 3.generator 4.解数学方程 5.异常 1.python库——counter from collections import Counter breakfast ...

  7. torch.Tensor文档学习笔记

    A torch.Tensor is a multi-dimensional matrix containing elements of a single data type. 张量(torch.Ten ...

  8. choice接口、同花顺使用

    一 choice接口使用 1.choice软件-->量化-->下载中心,下载python接口文件 EMQuantAPI_Python 2.要先绑定手机号,绑定后账户权限不够,暂时放弃. 二 ...

  9. C++逐词读取txt

    这一篇来写下std::ifstream读取txt的另一种方式,逐词读取,上一篇是按行读取,逐词读取的话每个单词都以空格或者换行等符号间隔开. 代码如下: #include "stdafx.h ...

  10. python里类的概念

    Python编程中类的概念可以比作是某种类型集合的描述,如"人类"可以被看作一个类,然后用人类这个类定义出每个具体的人--你.我.他等作为其对象.类还拥有属性和功能,属性即类本身的 ...