1.首先来说说创建线程的两种方式

一种方式是继承Thread类,并重写run()方法

 public class MyThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub }
}
//线程使用
MyThread mt = new MyThread(); //创建线程
mt.start(); //启动线程

另外一种方式是实现Runnable接口

 public class MyThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub }
}
//线程使用
MyThread mt = new MyThread();
Thread thread = new Thread(mt);//创建线程
thread.start(); //启动线程

2.两种方式创建线程比较

第一点:通过创建线程方式可以看出,一个是继承一个是实现接口,但是Java是只能继承一个父类,可以实现多个接口的一个特性,所以说采用Runnable方式可以避免Thread方式由于Java单继承带来的缺陷。

第二点:Runnable的代码可以被多个线程共享(Thread实例),适合于多个多个线程处理统一资源的情况。

  举例说明:模拟卖票,假设还剩5张票,分别采用两种方式来创建线程模拟

  TicketThread.java //采用继承方式模拟3个窗口卖5张票的情况

 public class TicketThread {
public static void main(String[] args) {
//创建了3个线程,模拟三个窗口卖票
MyThread mt1 = new MyThread("线程一");
MyThread mt2 = new MyThread("线程二");
MyThread mt3 = new MyThread("线程三"); //启动线程
mt1.start();
mt2.start();
mt3.start();
} } class MyThread extends Thread{
private int num = 5;//模拟还剩余5张票
private String name;//用来表示线程名称 public MyThread(String name){
this.name = name;
} @Override
public void run() {
while(num > 0){
num--;
System.out.println(name+"卖出了一张票,剩余票数为"+num);
}
}
}

运行结果为:

 线程一卖出了一张票,剩余票数为4
线程一卖出了一张票,剩余票数为3
线程一卖出了一张票,剩余票数为2
线程一卖出了一张票,剩余票数为1
线程一卖出了一张票,剩余票数为0
线程二卖出了一张票,剩余票数为4
线程二卖出了一张票,剩余票数为3
线程二卖出了一张票,剩余票数为2
线程二卖出了一张票,剩余票数为1
线程二卖出了一张票,剩余票数为0
线程三卖出了一张票,剩余票数为4
线程三卖出了一张票,剩余票数为3
线程三卖出了一张票,剩余票数为2
线程三卖出了一张票,剩余票数为1
线程三卖出了一张票,剩余票数为0

  可以看出共卖出了15张票,变成了每个线程都有5张票了

  TicketRunnable.java //采用Runnable实现

 public class TickerRunnable{
public static void main(String[] args) {
MyThread mt = new MyThread();
//同样创建3个线程
Thread t1 = new Thread(mt, "线程一");
Thread t2 = new Thread(mt, "线程二");
Thread t3 = new Thread(mt, "线程三");
//启动线程
t1.start();
t2.start();
t3.start();
} } class MyThread implements Runnable{
private int num = 5;//模拟还剩余5张票 @Override
public void run() {
while(num > 0){
num--;
System.out.println(Thread.currentThread().getName()+"卖出了一张票,剩余票数为"+num);
}
}
}

  运行结果为:

 线程一卖出了一张票,剩余票数为4
线程三卖出了一张票,剩余票数为3
线程三卖出了一张票,剩余票数为1
线程二卖出了一张票,剩余票数为0
线程一卖出了一张票,剩余票数为2

这样可以看出多个线程共享了Runnbale里面的5这个变量,至于结果为什么不是输出剩余票数4 3 2 1 0,这个是由于线程的调度问题造成的,每次运行都会看到不一样的结果。

创建线程的两种方式比较Thread VS Runnable的更多相关文章

  1. 创建线程的三种方式(Thread、Runnable、Callable)

    方式一:继承Thread类实现多线程: 1. 在Java中负责实现线程功能的类是java.lang.Thread 类. 2. 可以通过创建 Thread的实例来创建新的线程. 3. 每个线程都是通过某 ...

  2. 【java并发】传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  3. Java并发基础01. 传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  4. Java中创建线程的两种方式

    创建线程的第一种方式: 创建一个类继承Thread 重写Thread中的run方法 (创建线程是为了执行任务 任务代码必须有存储位置,run方法就是任务代码的存储位置.) 创建子类对象,其实就是在创建 ...

  5. 创建线程的两种方式:继承Thread类和实现Runnable接口

    第一种方式:继承Thread类 步骤:1.定义类继承Thread 2.覆写Threa类的run方法. 自定义代码放在run方法中,让线程运行 3.调用线程的star方法, 该线程有两个作用:启动线程, ...

  6. Java值创建线程的两种方式对比

    在Java中创建线程的方式有两种,第一种是直接继承Thead类,另一种是实现Runable接口.那么这两种方式孰优孰劣呢? 采用继承Thead类实现多线程: 优势:编写简单,如果需要访问当前线程,只需 ...

  7. java创建线程的两种方式及源码解析

    创建线程的方式有很多种,下面我们就最基本的两种方式进行说明.主要先介绍使用方式,再从源码角度进行解析. 继承Thread类的方式 实现Runnable接口的方式 这两种方式是最基本的创建线程的方式,其 ...

  8. Java实现线程的两种方式?Thread类实现了Runnable接口吗?

    Thread类实现了Runnable接口吗? 我们看看源码中对与Thread类的部分声明 public class Thread implements Runnable { /* Make sure ...

  9. 进程和创建线程的两种方法(threading.Thread)

    进程 如QQ 要以一个整体的形式暴露给操作系统管理,里面包含对各种资源的调用,内存的管理, 网络接口的调用等,进程就是各种资源管理的集合 线程:是操作系统最小的调度单位,是一串指令的结合 进程 要操作 ...

随机推荐

  1. 【转】phpmyadmin万能密码漏洞

    影响版本:2.11.3 / 2.11.4 利用方法:用户名处写入‘localhost’@'@”则登录成功. (注意全部是英文标点符号,最后一个为英文双引号) 附上几个php爆绝对路径的办法: phpM ...

  2. 对PostgreSQL cmin和cmax的理解

    看例子: 开两个终端来对比: 在终端A: [pgsql@localhost bin]$ ./psql psql () Type "help" for help. pgsql=# b ...

  3. 辛星浅谈PHP的混乱的编码风格

    我们都知道.各种编程语言都有自己的风格,即使是像C和C++那样一脉相承的语言(C++本意全然兼容C的语法).编程风格上还是有些区别.比方非常典型的就是C++风格的单行凝视和C风格的多行凝视. 而尽管J ...

  4. Mac联网恢复系统重新安装Lion

    Mac的Lion系统,虽然不像Windows那样需要经常重装,但也难免会有要重置的时候,比如更换硬盘.本文介绍如何利用Mac的联网恢复系统进行Lion系统的在线恢复.Mac的在线恢复系统只在近几年的机 ...

  5. mysql中不同事务隔离级别下数据的显示效果--转载

    事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都 ...

  6. Listview实现分页下载

    分析: * 1.初始控件,展示第一页数据 * 2.设置触发条件 * 1.设置滚动监听 * 2.判断是否在底部 * 3.判断是否停止滚动 * 4.更改网络请求参数为下一页 * 5.异步网络请求 * 6. ...

  7. Python 基础【第九篇】运算

    Python的运算符比较通俗和其他语言的几乎没什么区别 一.算数运算符 " + " 加法运算 >>> 1+3 4 加法运算扩展 "增强赋值操作" ...

  8. Discuz论坛架构改造

    这个论坛一直通过NFS服务共享文件给三台web服务器做负载均衡. 在实际环境中WEB Server总是出现CPU负载突然升高.文件交互的网络流量异常.甚至WEB Server夯死,NFS不能卸载,只能 ...

  9. C语言——结构体

    struct 是一种把一些数据项组合在一起的数据结构.在Go,Rust这些新语言中都保留了结构体 struct 的概念,这是C的精华. 定义匿名结构体 例:学生信息定义为一个结构体,信息内容包括学生的 ...

  10. job interview

    一 , 7series clock 二, SDRAM comtroller (DDR) 4.熟悉DDR2/3协议或Ethernet相关协议,并有实际项目经验者优先: 三,AXI bus(AMBA) 四 ...