高并发(2)- 多线程的创建
前言
上篇文章讲解了并发与并行的区别,那么从本篇文章开始就要着重描写线程了。
本篇文章就为大家带来最近本的线程创建方法。
一、线程的创建
JDK官方规定,线程(Thread)的创建有两种方式,继承Thread类,实现Runnable接口。所以今天来就是来看这两种线程创建的区别。
-
继承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