Java中Runnable和Thread的区别

概述

Runnable 是接口。

Thread 是类,且实现了Runnable接口。(源码可知)

在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。

1 public interface Runnable
2 {
3  
4     public abstract void run();
5 }

Thread类,有一个构造方法:public Thread(Runnable targer)

  public Thread(Runnable runnable)
    {
        daemon = false;
        stillborn = false;
        threadLocals = null;
        inheritableThreadLocals = null;
        threadStatus = 0;
        blockerLock = new Object();
        init(null, runnable, (new StringBuilder()).append("Thread-").append(nextThreadNum()).toString(), 0L);
    }

此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程。

使用情况

在程序开发中只要是多线程肯定永远以实现Runnable接口为主。

实现Runnable接口相比继承Thread类有如下好处:
1、避免继承的局限,一个类可以继承多个接口。
2、适合于资源的共享。

实例

以卖票为例,总共只有10张动车票了,全国3个窗口在卖。


继承Thread类的方法

  package multithreading;

public class MyThreadWithExtends extends Thread {

    private int tickets = 10;

    @Override
    public void run() {

        for (int i = 0; i <= 100; i++) {
            if(tickets>0){
                System.out.println(Thread.currentThread().getName()+"--卖出票:" + tickets--);
            }
        }
    }


    public static void main(String[] args) {
        MyThreadWithExtends thread1 = new MyThreadWithExtends();
        MyThreadWithExtends thread2 = new MyThreadWithExtends();
        MyThreadWithExtends thread3 = new MyThreadWithExtends();

        thread1.start();
        thread2.start();
        thread3.start();

        //每个线程都独立,不共享资源,每个线程都卖出了10张票,总共卖出了30张。如果真卖票,就有问题了。
    }

}

运行结果:

Thread-0--卖出票:10

Thread-2--卖出票:10

Thread-1--卖出票:10

Thread-2--卖出票:9

Thread-0--卖出票:9

Thread-2--卖出票:8

Thread-1--卖出票:9

Thread-2--卖出票:7

Thread-0--卖出票:8

Thread-2--卖出票:6

Thread-2--卖出票:5

Thread-2--卖出票:4

Thread-1--卖出票:8

Thread-2--卖出票:3

Thread-0--卖出票:7

Thread-2--卖出票:2

Thread-2--卖出票:1

Thread-1--卖出票:7

Thread-0--卖出票:6

Thread-1--卖出票:6

Thread-0--卖出票:5

Thread-0--卖出票:4

Thread-1--卖出票:5

Thread-0--卖出票:3

Thread-1--卖出票:4

Thread-1--卖出票:3

Thread-1--卖出票:2

Thread-0--卖出票:2

Thread-1--卖出票:1

Thread-0--卖出票:1

每个线程都独立,不共享资源,每个线程都卖出了10张票,总共卖出了30张。如果真卖票,就有问题了。

实现Runnable接口方式

public class MyThreadWithImplements implements  Runnable {
    private int tickets = 10;

    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {
            if(tickets>0){
                System.out.println(Thread.currentThread().getName()+"--卖出票:" + tickets--);
            }
        }
    }


    public static void main(String[] args) {
        MyThreadWithImplements myRunnable = new MyThreadWithImplements();
        Thread thread1 = new Thread(myRunnable, "窗口一");
        Thread thread2 = new Thread(myRunnable, "窗口二");
        Thread thread3 = new Thread(myRunnable, "窗口三");

        thread1.start();
        thread2.start();
        thread3.start();
    }
}

运行结果:

窗口二--卖出票:10
窗口三--卖出票:9
窗口一--卖出票:8
窗口三--卖出票:6
窗口三--卖出票:4
窗口三--卖出票:3
窗口三--卖出票:2
窗口三--卖出票:1
窗口二--卖出票:7
窗口一--卖出票:5

每个线程共享了对象myRunnable的资源,卖出的总票数是对的,但是顺序是乱的

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhang.Voi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值