• Java中Runnable和Thread的区别


    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;

    Thread:

    实现方式:继承Thread类,重写里面的run方法,用start方法启动线程

    (但是一个类只能继承一个父类,这是此方法的局限。)

    public class Main {
    
    public static void main(String[] args) {
    
    //测试Runnable
    MyThread1 t1 = new MyThread1();
    new Thread(t1).start();//同一个t1,如果在Thread中就不行,会报错
    new Thread(t1).start();
    new Thread(t1).start();
    
    }
    
    }
    class MyThread1 implements Runnable{
    private int ticket = 10;
    @Override
    //记得要资源公共,要在run方法之前加上synchronized关键字,要不然会出现抢资源的情况
    public synchronized void run() {
    for (int i = 0; i <10; i++) {
    if (this.ticket>0) {
    System.out.println("卖票:ticket"+this.ticket--);
    }
    }
    
    }
    
    }

    输出:

    A:0
    B:0
    A:1
    B:1
    B:2
    A:2
    B:3
    A:3
    A:4
    B:4

    Runnable:

    实现方式:实现里面Runnable的run方法,用new Thread(Runnable target).start()方法来启动

    (在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。此时观察Thread类,有一个构造方法:public Thread(Runnable targer)此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程。)

    public class Main {
    
    public static void main(String[] args) {
    
    //测试Runnable
    MyThread1 t1 = new MyThread1();
    new Thread(t1).start();//同一个t1,如果在Thread中就不行,会报错
    new Thread(t1).start();
    new Thread(t1).start();
    
    }
    
    }
    class MyThread1 implements Runnable{
    private int ticket = 10;
    @Override
    //记得要资源公共,要在run方法之前加上synchronized关键字,要不然会出现抢资源的情况
    public synchronized void run() {
    for (int i = 0; i <10; i++) {
    if (this.ticket>0) {
    System.out.println("卖票:ticket"+this.ticket--);
    }
    }
    
    }
    
    }

    输出:

    卖票:ticket10
    卖票:ticket9
    卖票:ticket8
    卖票:ticket7
    卖票:ticket6
    卖票:ticket5
    卖票:ticket4
    卖票:ticket3
    卖票:ticket2
    卖票:ticket1

    在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:

    1.一个类只能继承一个父类,但是可以继承多个接口

    2.实现Runnable,一个实例化对象可以创建多个线程,适合于资源的共享

  • 相关阅读:
    Web安全测试检查点
    "Could not resolve host: mirrorlist.centos.org; Unknown error"解决方法
    VMware vSphere Client中启动虚拟机提示No boot filename received/Operating System not found解决方法
    Android:Mstar Android8.0平台音量控制流程
    Android:系统自定义鼠标样式切换
    Android:系统日历添加默认账户
    Android:状态栏禁用时蓝牙多文件传输弹窗及进度显示
    Android:导入所需的系统jar包到Android studio
    Android:修改连接到AP端显示的设备名
    Android:StateMachine 之 WifiStateMachine
  • 原文地址:https://www.cnblogs.com/corolcorona/p/6672156.html
Copyright © 2020-2023  润新知