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. java异步任务处理

    1.场景 最近做项目的时候遇到了一个小问题:从前台提交到服务端A,A调用服务端B处理超时,原因是前端一次请求往db插1万数据,插完之后会去清理缓存.发送消息. 服务端的有三个操作 a.插DB b.清理 ...

  2. [MODx] 8. Snippet get data, chunk display

    Simple Example: Lets process this chunk and output its value. We have this Chunk, called "Welco ...

  3. IOS - 常用宏定义和功能方法

    可能不定期添加新的东西 github地址:https://github.com/yuqingzhude/CommonUseDemo /************************Tools**** ...

  4. java_泛型,设置类型通配符的上限

    package ming; import java.util.ArrayList; import java.util.Collection; import java.util.List; class ...

  5. nginx自定义模块编写-实时统计模块--转载

    原文:http://www.vimer.cn/2012/05/nginx%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A8%A1%E5%9D%97%E7%BC%96%E5%86%99- ...

  6. C C++源代码安全分析工具调研

    C C++源代码安全分析工具调研:http://blog.csdn.net/testing_is_believing/article/details/22047107

  7. mfc简易加法

    利用vs2013只做一个只有加法的计算器: 一.新建项目,然后如下图所示,进行选择,并创建. 二.下一步. 三.选择基于对话框,之后直接点完成 四.在整个编译器的最左边找到工具箱,并点击. /** 为 ...

  8. LVS配置与安装

    IP和主机准备: 准备VIP :20.20.20.1 lvs主机 :172.24.22.70 HA主机:172.24.22.4 包准备:ipvsadm-1.24.tar.gz 1.安装前配置包  2. ...

  9. 有关于Algorithm的基础介绍

    Niklaus Wirth:Algorithm + Data Structures = Programs 这句话呢,觉得很正确,算法和程序是不同的概念,算法的思想呢有递推,枚举,分治,贪婪,试探法,模 ...

  10. 【原】NGUI中的UIRoot脚本功能

    UIRoot是NGUI控件的根节点,使用是根据屏幕尺寸自动(或手动)调节节点下子控件的大小. 这个组件声明了在编辑模式下运行:[ExecuteInEditMode],在Inspector编辑修改属性值 ...