Thread与Runnable 区别

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卖票10
Thread-0卖票9
Thread-0卖票8
Thread-0卖票7
Thread-0卖票6
Thread-0卖票5
Thread-0卖票4
Thread-0卖票3
Thread-0卖票2
Thread-0卖票1
Thread-1卖票10
Thread-1卖票9
Thread-1卖票8
Thread-1卖票7
Thread-1卖票6
Thread-1卖票5
Thread-1卖票4
Thread-1卖票3
Thread-1卖票2
Thread-1卖票1

在这里 我们可以总结:
在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:
避免点继承的局限,一个类可以继承多个接口。
适合于资源的共享

所谓资源共享 也就是一个对象 启动了两个线程 那么对象中的
成员变量当然是共享的。

而继承Therad 的 只能创建两个 类的实例对象 来启动线程
当然他们的 成员变量不能共享 static 类变量除外,如果把上面代码
int static i=100; 这个样子修饰 也能实现资源共享

static修饰的变量是与类生命周期一样 当然这个类产生的对象 产生的
线程也能共享到 这个变量

下一章 我们学习 volatile

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值