Runnable和Thread的区别

简述

 

1、Runnable是接口,Thread是类且实现Runnable接口;

2、Thread线程是独立的不共享资源,Runnable是资源共享;

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

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

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

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接口为主。

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

举例

三个网友分别抢10张优惠券

 

 

继承Thread

/**
 * MyThreadWithExtends
 *
 * @author Stephen
 * @time 2020-7-1 17:59:02
 */
public class MyThreadWithExtends extends Thread {
 
    private int number = 10;
 
    @Override
    public void run() {
 
        for (int i = 0; i <= 100; i++) {
            if (number > 0) {
                number--;//优惠卷减一
                System.out.println(Thread.currentThread().getName() + "顾客抢到手,剩余优惠券:" + number);
            }
        }
    }
 
    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张。如果真抢,就有问题了。
    }
 
}

 

运行结果

 

实现Runnable接口

/**
 * MyThreadWithExtends
 *
 * @author Stephen
 * @time 2020-7-1 17:59:59
 */
public class MyThreadWithExtends  implements Runnable {
 
    private int number = 10;
 
    @Override
    public void run() {
 
        for (int i = 0; i <= 100; i++) {
            if (number > 0) {
                number--;//优惠卷减一
                System.out.println(Thread.currentThread().getName() + "顾客抢到手,剩余优惠券:" + number);
            }
        }
    }
 
    public static void main(String[] args) {
        MyThreadWithExtends myClass = new MyThreadWithExtends();
        Thread thread1 = new Thread(myClass,"网友1");
        Thread thread2 = new Thread(myClass,"网友2");
        Thread thread3 = new Thread(myClass,"网友3");
 
        thread1.start();
        thread2.start();
        thread3.start();
    }
 
}

 

运行结果:

 

posted @ 2020-12-22 16:58  Winton-H  阅读(4003)  评论(4编辑  收藏  举报