美文网首页
线程相关(一)Thread 和 Runnable

线程相关(一)Thread 和 Runnable

作者: 云鲸鱼rain | 来源:发表于2019-03-05 15:53 被阅读0次

今天浏览到大牛的博客(https://blog.csdn.net/luoweifu/article/details/46673975)看到了线程部分,遂查资料记录。


Java提供了两种创建线程的方式,一种是实现Runnable接口,一种是继承Thread类。
首先用的时候就面临二选一问题,Java的话,自然是Runnable接口用的多一些,万一你写的类已经有了父类呢,Java单继承,多实现。

再说一下两者的关系。
Thread类本身实现了Runnable接口,所以无论用哪种方式,其实都是实现了Runnable接口。Runnable只有一个run方法,,最终线程执行时都是覆写的run方法。

上代码。
实现Runnable方法

package test;

public class ThreadA implements Runnable {
    
    private Thread thread;
    private String threadName;
    
    public ThreadA(String threadName) {
        thread = new Thread(this,threadName);//疑问点1
        this.threadName = threadName;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i ++) {
             System.out.println(threadName + ": " + i);
          }
    }
    
    public void start() {
          thread.start();
    }
    
}

继承Thread方法

package test;

public class ThreadB extends Thread {
    
    private String threadName;
    
    public ThreadB(String threadName) {
        super(threadName);//疑问点2
        this.threadName = threadName;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i ++) {
             System.out.println(this.getName() + ": " + i);
          }
    }
}

测试类

package test;

public class ThreadTest {
    
     public static void main(String args[]) {
          ThreadA threadA = new ThreadA("ThreadA");
          threadA.start();
          ThreadB threadB = new ThreadB("ThreadB");
          threadB.start();
     }
}

好,写出来创建线程的两种方法后,本着没有一行代码是废话的原则,开始理解每一行代码。发现了两个疑问点(在代码中有标)

疑问点1:

实现了Runnable接口的ThreadA类中的构造函数里thread = new Thread(this,threadName);为什么要传 this ?
经过查看API发现thread有好多构造函数(见下图),为什么偏偏要传this。

英文版
中文版
疑问点的构造函数具体解释

当我去掉this,只传线程名的时候,发现输出不了任何内容。
在看了API之后,告诉我很重要的一点。
首先明白,最终目的我们都要执行复写的run方法,那么如何找到run方法?就靠这个参数了,target - 其 run 方法被调用的对象。(这里也是之后写线程同步关键的地方!)
所以我去掉this不输出内容的原因是:找不到执行哪个run方法。

疑问点2:

继承了Thread的类ThreadB中的构造函数里为什么要加 super(threadName);
总所周知,super(); 是默认写出来的,需要显式的写出来的情况无非就是需要调用父类有参数的构造函数。所以这里为什么要把线程名给父类Thread?
super(threadName);去掉之后,run还是可以的,但是,线程名变成了自动分配的线程名,而非ThreadB线程名。所以super(threadName)实际上是给此线程起名。

相关文章

  • 线程相关(一)Thread 和 Runnable

    今天浏览到大牛的博客(https://blog.csdn.net/luoweifu/article/details...

  • Java线程总结 之 Java Thread的相关方法

    线程脑图 Thread相关 创建线程的方法: Runnable方式: Runnable方式没有返回值。 Threa...

  • Android多线程

    Android 多线程 本篇博客将涉及以下内容: 多线程概述 Thread类和Runnable接口 线程相关(线程...

  • 多线程常见问题

    一.多线程相关问题 1. Thread 与runnable区别 共同点 区别:runnable 可以在多个线程中共...

  • java多线程

    首先介绍最基本的与线程相关的类Thread Thread实现了Runnable接口 使用Thread可以直接创建一...

  • 并发专题-Executor源码详解

    Runnable && Thread Runnable和Thread都是java.lang包最基本的线程操作类,相...

  • Thread

    线程机制理解开启线程: Thread thread = new Thread(Runnable).start();...

  • Java基础之Java线程

    1. 线程的使用 继承Thread类或者实现Runnable接口 Thread 和Runnable的区别 克服ja...

  • 2.Thread和Runnable

    创建线程的两种方法: 继承Thread,Thread也实现了Runnable 实现Runnable java线程的...

  • java面试知识点(三)

    实现多线程的两种方法:Thread与Runable: Thread类实现了Runnable。 用户线程和守护线程:...

网友评论

      本文标题:线程相关(一)Thread 和 Runnable

      本文链接:https://www.haomeiwen.com/subject/ossnuqtx.html