Java创建线程有几种方式?
发布日期:2021-05-08 19:31:59 浏览次数:21 分类:精选文章

本文共 1771 字,大约阅读时间需要 5 分钟。

                        Java创建线程有几种方式?

 Java 创建线程有两种方式:

1. 继承Thread类,并重写run()方法

2. 实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread

public static void main(String[] args) {    // 第一种    MyThread myThread = new MyThread();    myThread.start();    // 第二种    new Thread(() -> System.out.println("自己实现的run-2")).start();}public static class MyThread extends Thread {    @Override    public void run() {        System.out.println("自己实现的run-1");    }}

Java5 之后的ExecutorsExecutors工具类可以用来创建线程池。

小哥:Executors工具类是用来创建线程池的,这个线程池可以指定线程个数,也可以不指定,也可以指定定时器的线程池,它有如下常用的方法:

newFixedThreadPool(int nThreads):创建固定数量的线程池newCachedThreadPool():创建缓存线程池newSingleThreadExecutor():创建单个线程newScheduledThreadPool(int corePoolSize):创建定时器线程池

hread里的run()方法具体是怎么实现的吗?

Thread 中的run()方法里东西很少,就一个 if 判断:

@Overridepublic void run() {    if (target != null) {        target.run();    }}

有个target对象,会去判断该变量是否为空,非空的时候,去执行target对象中的run()方法,否则啥也不干。而这个target对象,就是我们说的Runnable

Runnable

@FunctionalInterfacepublic interface Runnable {    public abstract void run();}

这个抽象方法也是run()!如果我们使用Runnable接口,就需要实现这个run()方法。由于这个Runnable类上面标了@FunctionalInterface注解,所以可以使用函数式编程。

 

假如用第一种方式:继承了Thread类,然后重写了run()方法,那么它就不会去执行上面这个默认的run()方法了(即不会去判断target),会执行我重写的run()方法逻辑。

假如是用的第二种方式:实现Runnable接口的方式,那么它会执行默认的run()方法,然后判断target不为空,再去执行我在Runnable接口中实现的run()方法。

 

那如果我既继承了Thread类,同时我又实现了Runnable接口,比如这样,最后会打印什么信息出来呢?

public static void main(String[] args) {    new Thread(() -> System.out.println("runnable run")) {        @Override        public void run() {            System.out.println("Thread run");        }    }.start();}

“Thread run”

其实是 new 了一个对象(子对象)继承了Thread对象(父对象),在子对象里重写了父类的run()方法;然后父对象里面扔了个Runnable进去,父对象中的run()方法就是最初那个带有 if 判断的run()方法。

好了,现在执行start()后,肯定先在子类中找run()方法,找到了,父类的run()方法自然就被干掉了,所以会打印出:Thread run。

 Java 语言本身的父子继承关系,会优先执行子类重写的方法而已

在这里插入图片描述

上一篇:电路交换与分组交换的区别
下一篇:JVM - 参数配置影响线程数

发表评论

最新留言

表示我来过!
[***.240.166.169]2025年03月27日 15时46分26秒