线程我只写过继承Thread类的,后来知道java多线程有三种方式,今天首先比较一下常用的继承Thread类和实现Runnable接口的区别。

按着Ctrl键进入Thread之后,发现Thread类也是Runnable接口的之类,这应该就是它们之间的联系了吧。

继承Thread类

  1.  
    class MyThread1 extends Thread{
  2.  
    private int breakfast=10;
  3.  
    private String name;
  4.  
    public MyThread1(String name){
  5.  
    this.name=name;
  6.  
    }
  7.  
    public void run(){
  8.  
    for(int i =0;i<500;i++){
  9.  
    if(this.breakfast>0){
  10.  
    System.out.println(this.name+"卖早餐---->"+(this.breakfast--));
  11.  
    }
  12.  
    }
  13.  
    }
  14.  
    public static void main(String[] args) {
  15.  
    MyThread1 mt1= new MyThread1("一号窗口");
  16.  
    MyThread1 mt2= new MyThread1("二号窗口");
  17.  
    MyThread1 mt3= new MyThread1("三号窗口");
  18.  
    mt1.start();
  19.  
    mt2.start();
  20.  
    mt3.start();
  21.  
    }
  22.  
    }

实现Runnable接口

  1.  
    class MyThread2 implements Runnable{
  2.  
    private int breakfast =10;
  3.  
    private String name;
  4.  
    public void run(){
  5.  
    for(int i =0;i<500;i++){
  6.  
    if(this.breakfast>0){
  7.  
    System.out.println(Thread.currentThread().getName()+"卖早餐---->"+(this.breakfast--));
  8.  
    }
  9.  
    }
  10.  
    }
  11.  
     
  12.  
    public static void main(String[] args) {
  13.  
    //设计三个线程
  14.  
    MyThread2 mt = new MyThread2();
  15.  
    Thread t1 = new Thread(mt,"一号窗口");
  16.  
    Thread t2 = new Thread(mt,"二号窗口");
  17.  
    Thread t3 = new Thread(mt,"三号窗口");
  18.  
    t1.start();
  19.  
    t2.start();
  20.  
    t3.start();
  21.  
    }
  22.  
    }

显然,这两个结果是不同的。为什么会这样呢?我们来分析一下。

其实,第一个继承Thread类来实现多线程,其实是相当于拿出三件事即三个卖早餐10份的任务分别分给三个窗口,他们各做各的事各卖各的早餐各完成各的任务,因为MyThread继承Thread类,所以在newMyThread的时候在创建三个对象的同时创建了三个线程;实现Runnable的, 相当于是拿出一个卖早餐10份的任务给三个人去共同完成,newMyThread相当于创建一个任务,然后实例化三个Thread,创建三个线程即安排三个窗口去执行。

一个类只能继承一个父类,存在局限;一个类可以实现多个接口。在实现Runnable接口的时候调用Thread的Thread(Runnable run)或者Thread(Runnablerun,String name)构造方法创建进程时,使用同一个Runnable实例,建立的多线程的实例变量也是共享的;但是通过继承Thread类是不能用一个实例建立多个线程,故而实现Runnable接口适合于资源共享;当然,继承Thread类也能够共享变量,能共享Thread类的static变量;

如果第二种实现Runnable接口的方式要想达到第一种继承Thread类的效果,可以这样来实例化线程类。

  1.  
    //MyThread2 mt = new MyThread2();
  2.  
    Thread t1 = new Threadnew MyThread2(),"一号窗口");
  3.  
    Thread t2 = new Threadnew MyThread2(),"二号窗口");
  4.  
    Thread t3 = new Thread(new MyThread2(),"三号窗口");

总结

其实,抽象来说,这并不是Thread类和Runnable接口的区别了,这可以看做是接口和继承的问题。我们弄懂了接口和继承,就不难理解Thread和Runnable。

在刚接触的时候可能会有些迷糊这二者的区别于联系,但是实践和总结过后我们会发现这是两个完全不同的实现多线程,一个是多个线程分别完成自己的任务,一个是多个线程共同完成一个任务。其实,在实现一个任务用多个线程来做也可以用继承Thread类来实现,只是比较麻烦,一般我们用实现Runnable接口来实现。

转载。 https://blog.csdn.net/xdd19910505/article/details/50732328

多线程——Java中继承Thread类与实现Runnable接口的区别的更多相关文章

  1. Java基础知识强化之多线程笔记05:Java中继承thread类 与 实现Runnable接口的区别

    1. Java中线程的创建有两种方式:  (1)通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中. (2)通过实现Runnable接口,实例化Thread类. 2. ...

  2. Java中继承thread类与实现Runnable接口的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中, ...

  3. [转] Java中继承thread类与实现Runnable接口的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中, ...

  4. (转)多线程——继承Thread 类和实现Runnable 接口的区别

    java中我们想要实现多线程常用的有两种方法,继承Thread 类和实现Runnable 接口,有经验的程序员都会选择实现Runnable接口 ,其主要原因有以下两点: 首先,java只能单继承,因此 ...

  5. Java中实现多线程继承Thread类与实现Runnable接口的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中, ...

  6. 多线程——继承Thread 类和实现Runnable 接口的区别

    java中我们想要实现多线程常用的有两种方法,继承Thread 类和实现Runnable 接口,有经验的程序员都会选择实现Runnable接口 ,其主要原因有以下两点: 首先,java只能单继承,因此 ...

  7. Java 继承Thread类和实现Runnable接口的区别

    ava中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中,我 ...

  8. Java通过继承thread类与实现Runnable接口实现多线程的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 一.通过继承T ...

  9. Java线程演示样例 - 继承Thread类和实现Runnable接口

    进程(Process)和线程(Thread)是程序执行的两个基本单元. Java并发编程很多其它的是和线程相关. 进程 进程是一个独立的执行单元,可将其视为一个程序或应用.然而,一个程序内部同事还包括 ...

随机推荐

  1. 关于Qt中的QMutex——关于lock与unlock

    大概说一下用法,例子: QMutex mutex; int number = 6; void method1() { mutex.lock(); number *= 5; number /= 4; m ...

  2. nginx下配置vue前端项目

    server { listen 80; server_name _; root /opt/h5/index/; location / { index index.html index.htm inde ...

  3. Java内存溢出

    中间件应用Java内存溢出常见的三种情况: 1.OutOfMemoryError: Java heap space 2.OutOfMemoryError: PermGen space 3.OutOfM ...

  4. 20191209 【归档】Linux就该这么学

    学习背景 因为打算学习Redis和Docker,但是发现对Linux的操作已经完全忘记了,所以选择再学一次,但是不会深入的学习,选择了<Linux就该这么学>这本书,学完了感觉还挺好,但是 ...

  5. 洛谷 P1194 飞扬的小鸟 题解

    题面 这道题是一道隐藏的比较深的DP(我太蒟蒻了!) 设f[i][j]表示到第i列时高度为j的最少步数是多少: 求上升时的方案就是一个完全背包!,求下降时的方案就是一个01背包: 然后处理边界就能A掉 ...

  6. CF 1136C Nastya Is Transposing Matrices

    题目链接:http://codeforces.com/problemset/problem/1136/C 题目分析 看了题目之后,第一想法:任意位置都可以倒置,要是枚举,铁定的超时.所以需要探索规律. ...

  7. Linux端口是否占用的方法

    1.netstat或ss命令 netstat -anlp | grep 80 2.lsof命令 这个命令是查看进程占用哪些文件的 lsof -i:80 3.fuser命令 fuser命令和lsof正好 ...

  8. JVM 之类加载器

    一.什么是 JVM JVM(Java Virtual Machine)是一个可以执行 Java 字节码文件(即 .class 文件)的虚拟机进程.当 Java 源文件能被成功编译成 .class 文件 ...

  9. 剑指offer-2:斐波那契数列

    二.斐波那契数列 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 1.递归法 1). 分析 斐波那契数列的标准公式为 ...

  10. 集合类Hash Set,LinkedHashSet,TreeSet

    集合(set)是一个用于存储和处理无重复元素的高效数据结构.映射表(map)类似于目录,提供了使用键值快速查询和获取值的功能. HashSet类是一个实现了Set接口的具体类,可以使用它的无参构造方法 ...