创建线程的两种方式比较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 要以一个整体的形式暴露给操作系统管理,里面包含对各种资源的调用,内存的管理, 网络接口的调用等,进程就是各种资源管理的集合 线程:是操作系统最小的调度单位,是一串指令的结合 进程 要操作 ...
随机推荐
- lightoj1104(数学概率与期望)
题意: 增加一年有n天; 那么至少有几个人,能够保证至少两个人同一天生日的概率大于等于0.5; 思路: 转化一下题意; 就是求全部人生日都不同的概率小于等于0.5(那么至少两个人同一天就是大于等于0, ...
- tcp_tw_recycle和tcp_timestamps的文章汇总
临近年关,人会变得浮躁,期间写的代码可谓乱七八糟.不过出来混始终是要还的,这不最近就发现一个PHP脚本时常连不上服务器. 遇到这类问题,我习惯于先用strace命令跟踪了一下看看: shell ...
- mysqldump原理3
现网中数据库运维时,要经常对数据库做热备.为保证恢复时数据的完整性与一致性, 一种方法是在备份之前锁表,但锁表会影响正在运行的业务. mysqldump是当前MySQL中最常用的备份工具,通过mysq ...
- mysql控制流程函数
1.case语句 select case 2 when 1 then '男' when 2 then '女' else 'xoap' end as result; 2.if语句 select if(1 ...
- Linux 系统下原版 texlive 2016 的安装与配置
尽管大部分常见的linux系统的包管理器内都会包含texlive,然而最好还是安装TUG发布的原版texlive.这是由于:1,软件仓库内的texlive通常版本较陈旧:2,由于版权因素一些tex宏包 ...
- css动画——transition和animation
http://www.ruanyifeng.com/blog/2014/02/css_transition_and_animation.html 第一部分:CSS Transition 在CSS 3引 ...
- javascript开发中的封装模式(转)
var bgAuido={ audio : pingfan.$$('audio'), audioBtn : pingfan.$$('audioBtn'), init : function(){ var ...
- [转]oracle odp.net 32位/64位版本的问题
本文转自:http://www.cnblogs.com/yjmyzz/archive/2011/04/19/2020793.html 如果你的机器上安装了odp.net,且确信machine.conf ...
- [转]JSON序列化与反序列化
本文转自:http://www.cnblogs.com/ejiyuan/archive/2010/04/09/1708084.html 方法一:引入System.Web.Script.Serializ ...
- [记录] javascript 对象中使用setTimeout
参考:Javascript对象中关于setTimeout和setInterval的this介绍 使用最后一个方法终于弄好了,简直了,在对象中使用setTimeout原来是这样的 做的是分钟倒计时,倒数 ...