创建线程的两种方式比较Thread VS Runnable
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的更多相关文章
- 创建线程的三种方式(Thread、Runnable、Callable)
方式一:继承Thread类实现多线程: 1. 在Java中负责实现线程功能的类是java.lang.Thread 类. 2. 可以通过创建 Thread的实例来创建新的线程. 3. 每个线程都是通过某 ...
- 【java并发】传统线程技术中创建线程的两种方式
传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...
- Java并发基础01. 传统线程技术中创建线程的两种方式
传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...
- Java中创建线程的两种方式
创建线程的第一种方式: 创建一个类继承Thread 重写Thread中的run方法 (创建线程是为了执行任务 任务代码必须有存储位置,run方法就是任务代码的存储位置.) 创建子类对象,其实就是在创建 ...
- 创建线程的两种方式:继承Thread类和实现Runnable接口
第一种方式:继承Thread类 步骤:1.定义类继承Thread 2.覆写Threa类的run方法. 自定义代码放在run方法中,让线程运行 3.调用线程的star方法, 该线程有两个作用:启动线程, ...
- Java值创建线程的两种方式对比
在Java中创建线程的方式有两种,第一种是直接继承Thead类,另一种是实现Runable接口.那么这两种方式孰优孰劣呢? 采用继承Thead类实现多线程: 优势:编写简单,如果需要访问当前线程,只需 ...
- java创建线程的两种方式及源码解析
创建线程的方式有很多种,下面我们就最基本的两种方式进行说明.主要先介绍使用方式,再从源码角度进行解析. 继承Thread类的方式 实现Runnable接口的方式 这两种方式是最基本的创建线程的方式,其 ...
- Java实现线程的两种方式?Thread类实现了Runnable接口吗?
Thread类实现了Runnable接口吗? 我们看看源码中对与Thread类的部分声明 public class Thread implements Runnable { /* Make sure ...
- 进程和创建线程的两种方法(threading.Thread)
进程 如QQ 要以一个整体的形式暴露给操作系统管理,里面包含对各种资源的调用,内存的管理, 网络接口的调用等,进程就是各种资源管理的集合 线程:是操作系统最小的调度单位,是一串指令的结合 进程 要操作 ...
随机推荐
- java异步任务处理
1.场景 最近做项目的时候遇到了一个小问题:从前台提交到服务端A,A调用服务端B处理超时,原因是前端一次请求往db插1万数据,插完之后会去清理缓存.发送消息. 服务端的有三个操作 a.插DB b.清理 ...
- [MODx] 8. Snippet get data, chunk display
Simple Example: Lets process this chunk and output its value. We have this Chunk, called "Welco ...
- IOS - 常用宏定义和功能方法
可能不定期添加新的东西 github地址:https://github.com/yuqingzhude/CommonUseDemo /************************Tools**** ...
- java_泛型,设置类型通配符的上限
package ming; import java.util.ArrayList; import java.util.Collection; import java.util.List; class ...
- 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- ...
- C C++源代码安全分析工具调研
C C++源代码安全分析工具调研:http://blog.csdn.net/testing_is_believing/article/details/22047107
- mfc简易加法
利用vs2013只做一个只有加法的计算器: 一.新建项目,然后如下图所示,进行选择,并创建. 二.下一步. 三.选择基于对话框,之后直接点完成 四.在整个编译器的最左边找到工具箱,并点击. /** 为 ...
- LVS配置与安装
IP和主机准备: 准备VIP :20.20.20.1 lvs主机 :172.24.22.70 HA主机:172.24.22.4 包准备:ipvsadm-1.24.tar.gz 1.安装前配置包 2. ...
- 有关于Algorithm的基础介绍
Niklaus Wirth:Algorithm + Data Structures = Programs 这句话呢,觉得很正确,算法和程序是不同的概念,算法的思想呢有递推,枚举,分治,贪婪,试探法,模 ...
- 【原】NGUI中的UIRoot脚本功能
UIRoot是NGUI控件的根节点,使用是根据屏幕尺寸自动(或手动)调节节点下子控件的大小. 这个组件声明了在编辑模式下运行:[ExecuteInEditMode],在Inspector编辑修改属性值 ...