zoukankan      html  css  js  c++  java
  • 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();
        }
     
    }

    运行结果:

  • 相关阅读:
    This counter can increment, decrement or skip ahead by an arbitrary amount
    LUT4/MUXF5/MUXF6 logic : Multiplexer 8:1
    synthesisable VHDL for a fixed ratio frequency divider
    Bucket Brigade FIFO SRL16E ( VHDL )
    srl16e fifo verilog
    DualPort Block RAM with Two Write Ports and Bytewide Write Enable in ReadFirst Mode
    Parametrilayze based on SRL16 shift register FIFO
    stm32 spi sdcard fatfs
    SPI bus master for System09 (2)
    SQLSERVER中的自旋锁
  • 原文地址:https://www.cnblogs.com/winton-nfs/p/14172040.html
Copyright © 2011-2022 走看看