【Java多线程】创建多线程的方式二---实现Runnable接口(多窗口卖票)

news2024/9/25 23:20:08
题:创建三个窗口卖票,总票数为100张

1.继承Thread类的方式:

因为是三个窗口共卖100张所以我们在定义ticket时要用到static来修饰

private static int ticket = 100;

代码如下:

class Window extends Thread{
    private static int ticket = 100;
    @Override
    public void run() {
        while (true){
            if (ticket > 0) {
                System.out.println(getName() + "卖票,票号为:" + ticket);
                ticket --;
            }else {
                break;
            }
        }
    }
}
public class WindowTest {
    public static void main(String[] args) {
        Window t1 = new Window();
        Window t2 = new Window();
        Window t3 = new Window();

        t1.setName("窗口1");
        t2.setName("窗口2");
        t3.setName("窗口3");

        t1.start();
        t2.start();
        t3.start();
    }
}

运行结果如下:

我们可以看到窗口1,2,3都卖了票号为100的票,这个时候就要讲到线程的安全问题。我们先忽略 

如果我们不用static修饰改这么写?这个时候引入了创建多线程的方式二---->实现Runnable接口

=========================================================================

创建多线程的方式二---->实现Runnable接口

步骤如下:

1.创建一个实现了Runnable接口的类、

2.实现类去实现Runnable中的抽象方法:run()

3.创建实现类的对象

4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象

5.通过Thread类的对象调用start()

举例说明:遍历100以内的偶数

//1.创建一个实现了Runnable接口的类
class MThread implements Runnable{
//    2.实现类去实现Runnable中的抽象方法:run()
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                System.out.println(i);
            }
        }
    }
}
public class ThreadTest1 {
    public static void main(String[] args) {
//        3.创建实现类的对象
        MThread mThread = new MThread();
//        4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
        Thread t1 = new Thread(mThread);
//        5.通过Thread类的对象调用start()
        t1.start();
    }
}

在第四步中的运行过程:①启动线程 ②调用当前线程的run()-->调用了Runnable类型的target的run()。

如果我们再启动一个线程,遍历100以内的偶数

//1.创建一个实现了Runnable接口的类
class MThread implements Runnable{
//    2.实现类去实现Runnable中的抽象方法:run()
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }
    }
}
public class ThreadTest1 {
    public static void main(String[] args) {
//        3.创建实现类的对象
        MThread mThread = new MThread();
//        4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
        Thread t1 = new Thread(mThread);
//        5.通过Thread类的对象调用start():①启动线程 ②调用当前线程的run()-->调用了Runnable类型的target的run()
        t1.start();
        
        //再启动一个线程,遍历100以内的偶数
        Thread t2 = new Thread(mThread);
        t2.start();
    }
}

==============================回到问题==================================

使用实现Runnable接口的方式,多窗口卖票

代码如下:

class Window1 implements Runnable{

    private int ticket = 100;
    @Override
    public void run() {
        while (true){
            if (ticket > 0){
                System.out.println(Thread.currentThread().getName() + ":卖票,票号为:" + ticket);
                ticket--;
            }else {
                break;
            }
        }
    }
}
public class WindowTest1{
    public static void main(String[] args) {
        Window1 w = new Window1();

        Thread t1 = new Thread(w);
        Thread t2 = new Thread(w);
        Thread t3 = new Thread(w);

        t1.setName("窗口1");
        t2.setName("窗口2");
        t3.setName("窗口3");

        t1.start();
        t2.start();
        t3.start();

    }
}

运行结果如下:

 忽略线程安全问题。没有static可以使用实现Runnable接口的方式实现多窗口卖票

关于线程安全问题在之后的文章会讲解。

感谢观看!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/170578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s在华为openeuler搭建

参考文献 Kubernetes1.26.0部署(Ubuntu/CentOS)未完待续https://blog.csdn.net/weixin_67405599/article/details/128466282 Kubeadm 快速搭建 k8s v1.24.1 集群&#xff08;openEuler 22.03 LTS&#xff09;https://huaweicloud.csdn.net/633119cbd3efff3090b52068.html op…

宽度优先搜索算法(BFS)详解(超级详细讲解,附有大图)

目录 一.宽度优先搜索&#xff08;BFS&#xff09;是什么&#xff1f; 二.图解宽搜&#xff08;BFS&#xff09; 三.对比与发现 四。工具——队列 五.模板 六.最后 一.宽度优先搜索&#xff08;BFS&#xff09;是什么&#xff1f; 百度百科这样说&#xff1a; 宽度优先搜索…

一文讲透:质量管理的历史

&#xff08;本文摘自《软件质量保证与管理&#xff08;第2版&#xff09;》&#xff0c;清华大学出版社&#xff0c;2020&#xff09;1875年泰勒制诞生&#xff0c;意味着科学管理的开始&#xff0c;最初的质量管理也就是将检验活动与其他职能分离&#xff0c;出现了专职的检验…

2022-2023年中国数字经济投融资及创新展望研究报告(附下载链接)

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年12月份热门报告盘点罗振宇2023年跨年演讲PPT原稿吴晓波2022年年终秀演讲PPT原稿2023年&#xff0c;如何科学制定年度规划&#xff1f;《底层逻辑》高清配图清华大学256页…

AF647 DBCO荧光染料,AF647 DBCO,Alexa Fluor 647 DBCO,AF-647, 二苯并环辛

一、产品描述&#xff1a;Alexa Fluor 647是一种明亮且可感光的远红色染料&#xff0c;其激发非常适合633 nm激光线。Alexa Fluor 647染料用于在成像和流式细胞仪中产生稳定的信号&#xff0c;在pH 4到pH 10之间为水溶性且对pH不敏感。这种长波长Alexa Fluor 染料的荧光肉眼看不…

什么是元器件二筛,为何要二筛,如何二筛,二筛的要求与分级要点总结

&#x1f3e1;《电子元器件学习目录》 目录1&#xff0c;什么是二筛2&#xff0c;为何要二筛3&#xff0c;如何进行二筛4&#xff0c;二筛的要求5&#xff0c;二筛的分级6&#xff0c;总结1&#xff0c;什么是二筛 电子元器件测试筛选即元器件二次筛选&#xff0c;又被简称为二…

Spring @Autowired 用法

Spring Autowired 用法首先看下Component举例 1 :举例 2 :验证是否调用的是默认构造器如何&#xff0c;在启动的时候执行有参数的构造函数&#xff1f;&#xff1f;&#xff0c;这就要看Autowired注解了&#xff01;Autowired注解首先看下Component 在类级别上添加了Component…

Flask入门教程(视频教程笔记)

初始化flask项目 前面的python环境之类的就不说了。 该博客是看 Flask 入门 这个视频教程写的笔记&#xff0c;如果你想入门一下Flask&#xff0c;可以看看这个课&#xff0c;虽然简短&#xff0c;但是入门部分讲的很好&#xff0c;同时可以利用这篇博客复习复习。如果你想了解…

二、MES的生态链

1、MES功能模块图1、 符合MESA/ISA-95标准&#xff0c;基于SOA架构&#xff0c;技术架构与业务架构分离&#xff0c;实现多厂分布式部署具备标准化模型组件&#xff0c;可根据客户需求选取标准组件、或调整业务对象脚本&#xff0c;组合成全新的业务组件&#xff0c;实现企业ME…

电动汽车热管理方案

热管理技术作为汽车节能、提高经济性和保障安全性的重要措施&#xff0c;在汽车研发过程中具有重要作用。传统燃油汽车的热管理系统主要包括发动机、变速器散热系统和汽车空调&#xff0c;而电动汽车的热管理系统在燃油汽车热管理架构的基础之上&#xff0c;又增加了电机电控热…

【Python百日进阶-数据分析】Day228 - plotly的图表的变换

文章目录一、过滤二、分组三、聚合四、多重转换4.1 Filter and Group By4.2 Filter and Aggregate4.3 所有变换4.4 Dash中的应用一、过滤 如何通过 Plotly 在 Python 中使用过滤器。 注意 transforms在 v5 中已弃用&#xff0c;plotly将在未来版本中删除 import plotly.io as…

分享97个PHP源码,总有一款适合您

PHP源码 分享97个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 97个PHP源码下载链接&#xff1a;https://pan.baidu.com/s/1OUa-rpzDK6CG8oj6BLZSTw?pwdxdt2 提取码&#xff…

上传ipa到appstore的步骤说明

上传ipa到appstore&#xff0c;首先你要有苹果开发者账号&#xff0c;一定要使用你自己的苹果开发者账号的证书打包&#xff0c;才能将ipa上传到你自己的苹果账号&#xff0c;才能提交到app store里。假如你还没有苹果开发者账号&#xff0c;或者你有证书但不是你自己账号生成的…

ES6ES6

ES8-ES8 新特性 4.1.async 和 await async和await 两种语法结合可以让异步代码像同步代码一样 4.1.1.async函数 async函数的返回值为 promise 对象&#xff0c; 2.promise 对象的结果由 asynt函数执行的返回值决定 4.1.2await表达式awaity必须写在 async 函数中 2.await 右侧…

Rockchip开发系列 - 3.2.引脚配置默认上拉下拉

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 返回总目录:Rockchip开发系列 - 总目录 开发过程中发现rk3568-linux.dtsi中耳机监测应急一直是处于低电平状态: 这个gpio表格也说…

【MyBatis】| 在WEB中应⽤MyBatis(使⽤MVC架构模式)

目录 一&#xff1a;在WEB中应⽤MyBatis&#xff08;使⽤MVC架构模式&#xff09; 1. 前期准备 2. 核心代码实现 3. 事务控制 4. 三大对象的作用域 一&#xff1a;在WEB中应⽤MyBatis&#xff08;使⽤MVC架构模式&#xff09; 目标&#xff1a; ①掌握mybatis在web应⽤中怎…

【闪电侠学netty】第9章 实现客户端登录

【Netty】读书笔记 - 跟闪电侠学 1. 内容概要 1.1 总结 1.1.1 逻辑处理器 ChannelHandler&#xff08;详见 第11章 Pipeline与ChannelHandler&#xff09; 1.1.2 编程小技巧 public class PacketCodeC {...public static final PacketCodeC INSTANCE new PacketCodeC();.…

spring学习-第一讲-beanFactory与ApplicationContext

BeanFactory与ApplicationContext区别 创建一个springboot项目&#xff0c;对这个函数的main函数来进行执行。 ConfigurableApplicationContext context SpringApplication.run(BeanFactoryApplicationContextStudyApplication.class, args); 很明显&#xff0c;Configurabl…

“互联网+”六年,云徙科技打造数字化经营增长“头牌”

2022年底的全面开放结束了三年疫情&#xff0c;三年来以消费零售为代表的商业领域发生了深刻变局。根据2022年8月的第50次中国互联网络发展状况统计报告&#xff0c;互联网推动网民消费模式变迁&#xff1a;在消费场景方面&#xff0c;从线上消费逐步转变为线上线下融合消费&am…

软件安装教程-Vivado2018.3/ISE14.7/Modelsim10.5/Keil5/AD18/Cadence17.2/CAD2016

硬件工程师软件安装教程 1.Vivado2018.3安装教程 本文的主要内容是介绍 Vivado 2018.3 版本(提取码&#xff1a;ebdx)的安装步骤及其 license(提取码: 6xkh) 的获取与加载。 本文学习自《【ALINX】FPGA ZYNQ视频教程——AX7010/AX7020教程——基础部分》 首先下载安装包&…