Thread与Runnable的区别(用三个窗口同时出售10张车票为例子)

运行代码
运行结果 分析
System.out.println("开始测试多线程");
class MyThread extends Thread {
private int ticket=10;
private String name;
public MyThread(String name){
this.name=name;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if (this.ticket > 0) {
System.out.println(name
+ "正在出售倒数第" + this.ticket-- + "张票!");
}
}
}
}
Thread thread1 = new MyThread("一号窗");
Thread thread2 = new MyThread("二号窗");
Thread thread3 = new MyThread("三号窗");
thread1.start();
thread2.start();
thread3.start();
System.out.println("结束测试多线程");
开始测试多线程
结束测试多线程
一号窗正在出售倒数第10张票!
三号窗正在出售倒数第10张票!
三号窗正在出售倒数第9张票!
三号窗正在出售倒数第8张票!
三号窗正在出售倒数第7张票!
三号窗正在出售倒数第6张票!
三号窗正在出售倒数第5张票!
三号窗正在出售倒数第4张票!
三号窗正在出售倒数第3张票!
三号窗正在出售倒数第2张票!
三号窗正在出售倒数第1张票!
二号窗正在出售倒数第10张票!
一号窗正在出售倒数第9张票!
一号窗正在出售倒数第8张票!
一号窗正在出售倒数第7张票!
一号窗正在出售倒数第6张票!
一号窗正在出售倒数第5张票!
一号窗正在出售倒数第4张票!
一号窗正在出售倒数第3张票!
一号窗正在出售倒数第2张票!
一号窗正在出售倒数第1张票!
二号窗正在出售倒数第9张票!
二号窗正在出售倒数第8张票!
二号窗正在出售倒数第7张票!
二号窗正在出售倒数第6张票!
二号窗正在出售倒数第5张票!
二号窗正在出售倒数第4张票!
二号窗正在出售倒数第3张票!
二号窗正在出售倒数第2张票!
二号窗正在出售倒数第1张票!

出现票超,会出现各窗口自行处理10张。

各个线程完全独立

System.out.println("开始测试多线程");
class MyRunnable implements Runnable {
private int ticket=10;
private String name;
public MyRunnable(String name){
this.name=name;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if (this.ticket > 0) {
System.out.println(name
+ "正在出售倒数第" + this.ticket-- + "张票!");
}
}
}
}
Thread thread1 = new Thread(new MyRunnable("一号窗"));
Thread thread2 = new Thread(new MyRunnable("二号窗"));
Thread thread3 = new Thread(new MyRunnable("三号窗"));
thread1.start();
thread2.start();
thread3.start();
System.out.println("结束测试多线程");

开始测试多线程
结束测试多线程
一号窗正在出售倒数第10张票!
二号窗正在出售倒数第10张票!
二号窗正在出售倒数第9张票!
二号窗正在出售倒数第8张票!
二号窗正在出售倒数第7张票!
二号窗正在出售倒数第6张票!
一号窗正在出售倒数第9张票!
二号窗正在出售倒数第5张票!
三号窗正在出售倒数第10张票!
三号窗正在出售倒数第9张票!
三号窗正在出售倒数第8张票!
三号窗正在出售倒数第7张票!
三号窗正在出售倒数第6张票!
三号窗正在出售倒数第5张票!
三号窗正在出售倒数第4张票!
三号窗正在出售倒数第3张票!
三号窗正在出售倒数第2张票!
三号窗正在出售倒数第1张票!
二号窗正在出售倒数第4张票!
二号窗正在出售倒数第3张票!
二号窗正在出售倒数第2张票!
二号窗正在出售倒数第1张票!
一号窗正在出售倒数第8张票!
一号窗正在出售倒数第7张票!
一号窗正在出售倒数第6张票!
一号窗正在出售倒数第5张票!
一号窗正在出售倒数第4张票!
一号窗正在出售倒数第3张票!
一号窗正在出售倒数第2张票!
一号窗正在出售倒数第1张票!

出现票超,会出现各窗口自行处理10张。

各个线程完全独立

System.out.println("开始测试多线程");
class MyRunnable implements Runnable {
private int ticket = 10;
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if (this.ticket > 0) {
System.out.println(Thread.currentThread().getName()
+ "正在出售倒数第" + this.ticket-- + "张票!");
}
}
}
}
MyRunnable runnable=new MyRunnable();
Thread thread1 = new Thread(runnable,"一号窗");
Thread thread2 = new Thread(runnable,"二号窗");
Thread thread3 = new Thread(runnable,"三号窗");
thread1.start();
thread2.start();
thread3.start();
System.out.println("结束测试多线程");

开始测试多线程
结束测试多线程
一号窗正在出售倒数第10张票!
一号窗正在出售倒数第7张票!
一号窗正在出售倒数第6张票!
一号窗正在出售倒数第5张票!
一号窗正在出售倒数第4张票!
一号窗正在出售倒数第3张票!
一号窗正在出售倒数第2张票!
一号窗正在出售倒数第1张票!
三号窗正在出售倒数第8张票!
二号窗正在出售倒数第9张票!

票数正常,各窗口以剩下的票数出售。

线程共同使用类,但运行多次会发现

有些窗口出售同样的票,意味并发时

会出现同票出售。

总结:

采用继承Thread类方式:
 (1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
 (2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
采用实现Runnable接口方式:
 (1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资                源的情况。
 (2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。

三、多线程之Thread与Runnable的区别的更多相关文章

  1. Java多线程之Thread、Runnable、Callable及线程池

    一.多线程 线程是指进程中的一个执行流程,一个进程中可以有多个线程.如java.exe进程中可以运行很多线程.进程是运行中的程序,是内存等资源的集合,线程是属于某个进程的,进程中的多个线程共享进程中的 ...

  2. 慕课网_细说多线程之Thread VS Runnable

    第1章 课前准备 1-1 前言 (00:49) 第2章 Thread VS Runnable 2-1 回顾线程创建的两种方式 (02:33) 继承Thread类 class MyThread exte ...

  3. 多线程编程(三)--创建线程之Thread VS Runnable

    前面写过一篇基础的创建多线程的博文: 那么本篇博文主要来对照一下这两种创建线程的差别. 继承Thread类: 还拿上篇博客的样例来说: 四个线程各自卖各自的票,说明四个线程之间没有共享,是独立的线程. ...

  4. 细说多线程之Thread与Runnable

    1:创建线程的两种方式: 继承Thread类 public class MyThread extends Thread { @Override public void run() { } } MyTh ...

  5. Android线程之Thread 、Runnable 的两个例子

    Thread例子: package fy.test; import android.app.Activity; import android.os.Bundle; import android.os. ...

  6. 细说多线程之Thread VS Runnable

    [线程创建的两种方式] [线程的生命周期] ● 就绪:创建了线程对象后,调用了线程的start(). (注意:此时线程只是进入了线程队列,等待获取CPU服务,具备了运行的条件,但并不一定已经开始运行了 ...

  7. 多线程之thread和runnable

    Runnanle方式可以避免Thread由于单继承特性带来的缺陷. Runnable代码可以被多个线程(thread实例)共享,适用于多个线程处理同一资源的情况. 线程的生命周期:创建,就绪,阻塞,运 ...

  8. Java基础-进程与线程之Thread类详解

    Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...

  9. iOS多线程之Thread

    多线程 • Thread 是苹果官方提供的,简单已用,可以直接操作线程对象.不过需要程序员自己管理线程的生命周期,主要是创建那部分 优缺点 面向对象,简单易用 直接操作线程对象 需要自己管理线程生命周 ...

随机推荐

  1. 为什么是InfluxDB | 写在《InfluxDB原理和实战》出版之际

    1年前写的一篇旧文,文中的分析,以及探讨的问题和观点,至今仍有意义. 从2016年起,笔者在腾讯公司负责QQ后台的海量服务分布式组件的架构设计和研发工作,例如微服务开发框架SPP.名字路由CMLB.名 ...

  2. CSS篇-dispaly、position、定位机制、布局、盒子模型、BFC

    display常用值 参考链接英文参考链接中文 // 常用值 none:元素不显示 inline:将元素变为内联元素,默认 block:将元素变为块级元素 inline-block:将元素变为内联块级 ...

  3. 使用Java+NetBeans设计web服务和页面,用Tomcat部署网页

    一 安装NetBeans(自动安装jdk) 二 创建服务器 三 发布服务 一 安装NetBeans(自动安装jdk) 进入oracle的下载界面: http://www.oracle.com/tech ...

  4. 通过unity Distribution Portal发布华为渠道的游戏

    背景说明 前面几个帖子详细介绍了: Unity Editor安装和Apk打包 手把手教您快速运行Unity提供的华为游戏demo 使用unity完成华为游戏的初始化和华为帐号登录 快速开发Unity游 ...

  5. PTA 线性表元素的区间删除

    6-8 线性表元素的区间删除 (20 分)   给定一个顺序存储的线性表,请设计一个函数删除所有值大于min而且小于max的元素.删除后表中剩余元素保持顺序存储,并且相对位置不能改变. 函数接口定义: ...

  6. 6、MyBatis教程之日志实现

    7.日志实现 思考:我们在测试SQL的时候,要是能够在控制台输出 SQL 的话,是不是就能够有更快的排错效率? 如果一个 数据库相关的操作出现了问题,我们可以根据输出的SQL语句快速排查问题. 对于以 ...

  7. OLAP引擎:基于Druid组件进行数据统计分析

    一.Druid概述 1.Druid简介 Druid是一款基于分布式架构的OLAP引擎,支持数据写入.低延时.高性能的数据分析,具有优秀的数据聚合能力与实时查询能力.在大数据分析.实时计算.监控等领域都 ...

  8. 用RUST写流媒体服务器实战——rtmp chunk 深入解析

    用RUST写流媒体服务器实战--rtmp chunk 深入解析 最近几个月断更了,把精力放在了新的开源项目上,一个用rust写的流媒体服务xiu. 实现过程中踩了不少坑,今天说下rtmp中的chunk ...

  9. Qt信号槽源码剖析(二)

    大家好,我是IT文艺男,来自一线大厂的一线程序员 上节视频给大家讲解了Qt信号槽的基本概念.元对象编译器.示例代码以及Qt宏:今天接着深入分析,进入Qt信号槽源码剖析系列的第二节视频. Qt信号槽的宏 ...

  10. Java读取图片exif信息实现图片方向自动纠正

    起因 一个对试卷进行OCR识别需求,需要实现一个功能,一个章节下的题目图片需要上下拼接合成一张大图,起初写了一个工具实现图片的合并,程序一直很稳定的运行着,有一反馈合成的图片方向不对,起初怀疑是本身图 ...