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

0 0
原创粉丝点击