Thread与Runnable 区别
来源:互联网 发布:淘宝网百度贴吧 编辑:程序博客网 时间:2024/05/13 04:12
Thread与Runnable 区别
作者前言: 接触编程时间不是很长,写博客 都是看一些书和视屏
为了不忘记 所学习的东西而做的笔记 也想分享给大家,
虽然作者是一个菜鸟,但是菜鸟就是得先飞,废话不说
相信有很多的博客 论坛对这区别做了很多 说法 讲解,
但是为了大家能搜索到 解决问题 所以标题才这个样子写,请大家
多多指教。
java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限。
我们老是说 继承Therad 因为 JAVA是单继承多实现的机制,所以使用继承 有一定的局限性,而实现 Runnable 可以达到资源共享,怎么样的一个资源共享呢, 其实我们打开JDK1.6文档可以发现 Thread其实是实现了Runnable 接口的 而Runnable 只有一个抽象方法,run() 方法
Runnable接口出现 是为了 避免一个类 只想要 提供多线程执行的机制,而不需要 重写Thread的任何方法的时候,run()方法 就是多线程的执行体
而控制 多线程的方法是在Thread类中
首先我们来看一个类实现Runable接口执行效果:
public class Test implements Runnable{//为什么 Runnable 能实现资源共享 private volatile int i = 100; //票数 @Override public void run() { while (i>0){ System.out.println(Thread.currentThread().getName()+"卖票"+i); i--; } } public static void main(String ages[]){ Test my1 = new Test(); //线程 0 Thread th1 = new Thread(my1); th1.start(); Thread th2 = new Thread(my1); 线程 1 th2.start(); }}
Thread-0卖票13
Thread-0卖票12
Thread-0卖票11
Thread-1卖票16
Thread-0卖票10
Thread-1卖票9
Thread-0卖票8
Thread-1卖票7
Thread-0卖票6
Thread-1卖票5
Thread-0卖票4
Thread-1卖票3
Thread-0卖票2
Thread-1卖票1
我们可以看到 线程0 和线程1 是共享了 int i 这个变量 这就是两个窗口一共卖了100张票的例子 大家可以看到我们使用了 volatile 来修饰 票数
我在这里先卖一个关子 我们下一章讲 volatile的作用,但是 如果再这里不加 volatile 这个修饰符 不管怎么样 都会多卖一张 101张,加了这个volatile 就只会卖100张了 大家可以把我代码 粘 过去试试哦?
下面是Thread 的执行:
public class Test extends Thread{ private volatile int i = 10; @Override public void run() { while (i>0){ System.out.println(Thread.currentThread().getName()+"卖票"+i); i--; } } public static void main(String ages[]){ Test test1 = new Test(); Test test2 = new Test(); test1.start(); test2.start(); }}Thread-0卖票10Thread-0卖票9Thread-0卖票8Thread-0卖票7Thread-0卖票6Thread-0卖票5Thread-0卖票4Thread-0卖票3Thread-0卖票2Thread-0卖票1Thread-1卖票10Thread-1卖票9Thread-1卖票8Thread-1卖票7Thread-1卖票6Thread-1卖票5Thread-1卖票4Thread-1卖票3Thread-1卖票2Thread-1卖票1
在这里 我们可以总结:
在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:
避免点继承的局限,一个类可以继承多个接口。
适合于资源的共享
所谓资源共享 也就是一个对象 启动了两个线程 那么对象中的
成员变量当然是共享的。
而继承Therad 的 只能创建两个 类的实例对象 来启动线程
当然他们的 成员变量不能共享 static 类变量除外,如果把上面代码
int static i=100; 这个样子修饰 也能实现资源共享
static修饰的变量是与类生命周期一样 当然这个类产生的对象 产生的
线程也能共享到 这个变量
下一章 我们学习 volatile
- Thread 与Runnable区别
- Thread与Runnable区别
- Thread 与Runnable区别
- Thread与Runnable区别
- Thread 与 Runnable 区别
- runnable与thread区别
- Thread与Runnable 区别
- thread与runnable区别
- Runnable与Thread的区别
- Thread 与Runnable区别详解
- Thread与Runnable的区别
- thread 与 runnable 的区别
- runnable与Thread的区别
- thread与runnable的区别
- Thread与Runnable的区别
- thread与runnable的区别
- Thread与Runnable的区别
- Runnable接口与Thread类的区别
- 文章标题 POJ :1666 Candy Sharing Game(模拟)
- javascript中URL的编码
- 构造回文_腾讯实习生编程题
- VS2013 C4996解决方案
- java透明图片上传,透明部分变黑的解决方案。
- Thread与Runnable 区别
- SWIG(Simplified Wrapper and Interface Generator)
- Git 索引文件(index file)
- x2检验(chi-square test)/ 卡方检验
- VS2013安装问题
- 告诉你一个真实的 OpenStack:都谁在用,用来干什么?
- ListView--内容不显示
- POJ 2823 Sliding Window <速度特快 单调队列>
- 图的最短路径问题