高并发(2)- 多线程的创建

2020-03-27  本文已影响0人  残冬十九

前言

上篇文章讲解了并发与并行的区别,那么从本篇文章开始就要着重描写线程了。

本篇文章就为大家带来最近本的线程创建方法。


一、线程的创建

JDK官方规定,线程(Thread)的创建有两种方式,继承Thread类,实现Runnable接口。所以今天来就是来看这两种线程创建的区别。

  1. 继承Thread接口

    我们直接上代码

/**
 * @version 1.0
 * @Description 用户继承Thread线程实现
 * @Author wb.yang
 * @Date 2020/3/15 22:29
 */
public class UserThread extends Thread {

    @Override
    public void run() {
        //重写Thread的run方法,我们的逻辑实现
        System.out.println("this is userThread");
    }
}

从代码中可以看出,我们的UserThread类继承了Thread类,并重写了run方法,并在方法中写入了我们的逻辑。接下来上我们的测试类代码

/**
 * @version 1.0
 * @Description 用户线程测试代码
 * @Author wb.yang
 * @Date 2020/3/15 22:33
 */
public class UserThreadTest {

    public static void main(String[] args) {
        //创建UserThread的对象
        UserThread userThread = new UserThread();
        //调用Thread的start方法,启动线程
        userThread.start();
    }
}
image.gif

我们已经写好了UserThread的测试代码。从代码中可以看出,我们先创建了UserThread的对象,因为UserThread继承了Thread,所以UserThread也便是一个线程类了,可以直接调用start方法来调用线程。

image image.gif

​​

从截图中可以看出,UserThread中的run方法已经执行,并且打印出数据。

这便是第一种线程创建的方法,继承Thread。

2.实现Runnable接口

同样直接上代码

/**
 * @version 1.0
 * @Description 用户实现Runnable接口实现
 * @Author wb.yang
 * @Date 2020/3/16 21:48
 */
public class UserRunnable implements Runnable {

    public void run() {
        //重写Run方法执行逻辑
        System.out.println("This Is UserRunnable");
    }
}

image.gif

从代码中可以看出,我们的UserRunnable类实现了Runnable接口,并重写了run方法,在方法中写入了我们的逻辑。

/**
 * @version 1.0
 * @Description 用户线程测试代码
 * @Author wb.yang
 * @Date 2020/3/15 22:33
 */
public class UserThreadTest {

    public static void main(String[] args) {
        /*//创建UserThread的对象
        UserThread userThread = new UserThread();
        //调用Thread的start方法,启动线程
        userThread.start();*/

        // 创建UserRunnable的对象
        UserRunnable userRunnable = new UserRunnable();
        //由于实现了Runnable,还不是线程,所以需要new一个Thread,然后传入其中,执行
        new Thread(userRunnable).start();
    }
}

这是我们写好的UserRunnable的测试代码。我们依旧先创建了UserRunnable的对象,但是由于UserRunnable只是实现了Runnable接口,UserRunnable本身还不是一个线程,所以需要new出一个Thread,然后将UserRunnable放入其中,这时候便在线程之中了,然后调用线程额start()方法启动线程。

image image.gif

​​

这是我们运行代码的截图,从中可以看出UserRunnable也已经成功执行了。

这边是线程的第二种创建方法,实现Runnable接口。

二、两种创建的区别

既然是两种线程的创建方法,那肯定是有区别的,那就来讲讲其中的区别把。

1.java中的单继承多实现的,所以如果继承了Thread类的话就不能在继承其他类,而接口是多实现的,在实现了Runnable接口的情况下,不妨碍继续实现其他接口。这个区别再具体的业务场景中需要灵活使用。

2.Thread是对线程的抽象,也就是继承了Thread的话本身也就是一个线程类,可以直接执行,而Runnable是对任务的抽象,本身只是一个普通的类,并不是一个线程,所以还需要额外的创建一个线程来执行实现Runnable接口的任务,这也是在前面代码中所写出的那样。

两种方法没有说那种特别好,实用的话还是根据具体的业务场景来使用。

额外提一句,线程只能执行一次,执行第二次便会报错。

image image.gif

上一篇下一篇

猜你喜欢

热点阅读