当前位置: 首页 > news >正文

分析两种实现多线程的方式:Thread类和Runnable接口

写一个程序,模拟4个售票窗口共同卖100张火车票的程序。

1:使用继承Thread类方式实现()。
2:使用实现Runnable接口方式实现()。

第一种方式(没有共享数据,售票窗口各自买100张票,那4个售票窗口就有400张票)

package com.ljq.test;

/**
* 使用Thread类模拟4个售票窗口共同卖100张火车票的程序
*
* 没有共享数据,每个线程各卖100张火车票
*
*
@author jiqinlin
*
*/
public class ThreadTest {

public static void main(String[] args){
new MyThread().start();
new MyThread().start();
new MyThread().start();
new MyThread().start();
}

public static class MyThread extends Thread{
// 车票数量
private int tickets = 100 ;
@Override
public void run() {
while (tickets > 0 ){
System.out.println(
this .getName() + " 卖出第【 " + tickets --+ " 】张火车票 " );
}
}
}
}

                           

第二种方式(共享数据,4个售票窗口共同卖100张票)

package com.lynch.share;

/**
 * 使用Runnable接口模拟4个售票窗口共同卖100张火车票的程序
 * 
 * 共享数据,4个线程共同卖这100张火车票
 *
 * @author Lynch
 */
public class TicketRunnableTest {
    public static void main(String[] args) {
        Runnable runnable = new MyThread();
        new Thread(runnable).start();
        new Thread(runnable).start();
        new Thread(runnable).start();
        new Thread(runnable).start();
    }

    public static class MyThread implements Runnable {
        // 车票数量
        private int tickets = 100;

        public void run() {
            while (tickets > 0) {
                System.out.println(Thread.currentThread().getName() + "卖出第【" + tickets-- + "】张火车票");
            }
        }

    }
}

         

这两种线程创建方式的比较

使用Runnable接口
实际工作中,几乎所有的多线程应用都用实现Runnable这种方式。
Runnable适合多个相同程序代码的线程去处理同一资源的情况。把虚拟CPU(线程)同程序的代码、数据有效的分离,较好的体现了面向对象的设计思想。
避免由于Java的单继承特性带来的局限性。也就是如果新建的类要继承其他类的话,因为JAVA中不支持多继承,就只能实现java.lang.Runnable接口。
有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。

                     
继承Thread类
不能再继承他类了。
编写简单,可以直接操纵线程,无需使用Thread.currentThread()。
请查询API 获得currentThread方法的作用说明。

转载于:https://www.cnblogs.com/linjiqin/archive/2011/04/10/2011802.html

相关文章:

  • 直接来我的私人博客吧
  • Ado.Net读取Excel常见问题总结
  • 某店铺收银系统开发总结
  • (转)项目管理杂谈-我所期望的新人
  • Flash在DirectX中的绘制
  • 在 SharePoint2010 中使用 XML 查看器取得其他站点的内容列表
  • C实现关机
  • 项目管理实践教程
  • Spring Security学习二
  • 动态创建数据库实例
  • OpenGL FAQ
  • 在.NET环境中实现每日构建--NAnt篇
  • 刚刚达内的宣讲会(碰到微软经典笔试题)
  • 中国软件创新产业弯道超车
  • AjaxControlToolkit学习笔记
  • [笔记] php常见简单功能及函数
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • CentOS 7 防火墙操作
  • HashMap剖析之内部结构
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • orm2 中文文档 3.1 模型属性
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • socket.io+express实现聊天室的思考(三)
  • Terraform入门 - 3. 变更基础设施
  • Web标准制定过程
  • 创建一个Struts2项目maven 方式
  • - 概述 - 《设计模式(极简c++版)》
  • 给第三方使用接口的 URL 签名实现
  • 区块链技术特点之去中心化特性
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 什么是Javascript函数节流?
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 我有几个粽子,和一个故事
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一起参Ember.js讨论、问答社区。
  • 在weex里面使用chart图表
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 我们雇佣了一只大猴子...
  • ​configparser --- 配置文件解析器​
  • #include
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #控制台大学课堂点名问题_课堂随机点名
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • $.ajax()
  • (10)ATF MMU转换表
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)计算机毕业设计ssm电影分享网站
  • (六)vue-router+UI组件库
  • (学习日记)2024.01.19
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (转)EOS中账户、钱包和密钥的关系