Java多线程学习之售卖车票问题(三)

一、继承Thread来创建线程

package com.xu.chap2;

/**
 * 目的:实现火车站卖票系统(第一种创建线程的方式)
 *
 */

//第一种方式直接继承Thread来创建线程
class T1 extends Thread
{
    //加static的原因是:每次new一个对象出来,该对象就会有一个tickets属性,这样的话就相当于卖2倍票数,当然错误
    private static int tickets = 10;

    //加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();
    }
}

 运行结果:

 二、使用Runnable接口创建线程

package com.xu.chap2;

/**
 * 目的:实现火车站的卖票系统(第二种创建线程的方式)
 */

//创建线程的第二种方式
class T2 implements Runnable {

    /*相较于第一种创建线程的方式,
     * 这里不需要加static,
     * 因为该创建方式是同一个对象里面的不同线程,
     * 第一种创建方式是不同对象的不同线程,
     */
    private int tickets = 10;
    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();
    }
}

运行结果:

今天到此为止,我们下回再见!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易雪寒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值