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. mysql操作和详解

    温馨提示 mysql安装包里面:mysqld是服务端,mysql是客户端. mysqld其实是SQL后台程序(也就是MySQL服务器),它是关于服务器端的一个程序,mysqld意思是mysql dae ...

  2. 在swoole中制作一款仿制laravel的框架

    首先需要确定一下思路:我希望基于swoole的扩展开发的代码在run起来的时候,在接收到ws或是tcp等消息时,自动路由到某个类上,同时类可以实现加载类的依赖注入功能.目前市面上占据主流的一款框架La ...

  3. python使用try...except语句处理异常

    try....except语句语法格式: try: <语句> except(异常名称): <语句> 注意在except语句中的括号中的异常名称是可以省略的,当省略时就是全捕捉 ...

  4. 移动端调试vConsole

    当我们在进行移动端开发的时候,经常会出现在pc显示正常,在移动端却各种异常的情况.这时候我们在手机上又看不到error log. 所以我们就需要vConsole这样一个移动端开发神器. 那具体要怎么使 ...

  5. 冒泡排序(BubbleSort)

    介绍: 冒泡排序是一种最基础的交换排序(两两比较待排序的关键字,交换不满足次序要求的那对数,直到整个表都满足次序要求为止),工作方式如同碳酸饮料中的二氧化碳气泡最终会上浮到顶端一样,故名"冒 ...

  6. 学习C#第二天

    变量 变量是什么? 在数学中,我们对变量的概念有一定的了解和认识,如y=x^2,其中,x,y都是变量. 定义 一个变量就是存储区(内存)中的一个存储单元 变量的声明及初始化 使用变量的步骤 声明一个变 ...

  7. Java框架Spring Boot & 服务治理框架Dubbo & 应用容器引擎Docker 实现微服务发布

    微服务系统架构实践 开发语言Java 8 框架使用Spring boot 服务治理框架Dubbo 容器部署Docker 持续集成Gitlab CI 持续部署Piplin 注册中心Zookeeper 服 ...

  8. Asp.Net Core 5 REST API 使用 JWT 身份验证 - Step by Step

    翻译自 Mohamad Lawand 2021年1月22日的文章 <Asp Net Core 5 Rest API Authentication with JWT Step by Step> ...

  9. .netcore ioc 循环依赖问题及其相关思考之DispatchProxy

    .netcore引入了ioc机制让开发人员逐步习惯从过去的各种new对象变成通过IOC框架来管理对象的生命周期.这样当我们需要某个对象的时候,我们一般在构造函数里申明该对象的接口,即可通过ioc容器创 ...

  10. 【macOS】显示/隐藏 允许“任何来源”的应用

    问题产生 在macOS中安装某些版本软件时会提示: "xxx"已损坏,打不开.您应该将它移动到废纸篓. 某些情况下实际上并不是软件已损坏,而是因为macOS对于开发者的验证导致软件 ...