“这是我参与8月更文挑战的第26天,活动详情查看: 8月更文挑战”
前言
上篇(传送门)我们一起学习了线程和进程的区别,以及线程调度的概念,本篇我们就来学习如何创建多线程。
以下内容如有不正之处,欢迎掘友们批评指正!
多线程
Java使用java.lang.Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。每个线程的作用是完成一定的任务,实际上就是执行一段程序流即一段顺序执行的代码。Java使用线程执行体来代表这段程序流。
创建多线程的第一种方式:创建Thread类的子类
Java中通过继承Thread类来创建并启动多线程的步骤如下︰
-
1.定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体。
-
2.创建Thread子类的实例,即创建了线程对象
-
3.调用线程对象的start()方法来启动该线程 java程序属于抢占式调度,那个线程的优先级高,那个线程优先执行;同一个优先级,随机选择一个执行 来看代码实现:
public class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("run-->"+i);
}
}
}
MyThread mt = new MyThread();
mt.start();
for (int i = 0; i < 20; i++) {
System.out.println("main-->"+i);
}
创建多线程第二种方法:实现Runnable接口
采用java.lang.Runnable也是非常常见的一种,我们只需要重写run方法即可。 步骤如下:
- 1.定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
- ⒉.创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
- 3.调用线程对象的start()方法来启动线程。
Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。
使用runnable接口和Thread还有些不同,咱们通过实例来看一下。
public class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("run-->"+i);
}
}
}
public static void main(String[] args) {
MyRunnable mr = new MyRunnable();
new Thread(mr).start();
for (int i = 0; i < 20; i++) {
System.out.println("main-->"+i);
}
}
Thread和Runnable创建多线程的区别
实现Runnapte接口创建多线程程序的好处:
- 1.避免了单继承的局限性
- 一个类只能继承一个类(一个人只能有一个亲爹),类继承了Thread类就不能继承其他的类实现了Runnable接口,还可以继承其他的类,实现其他的接口
- 2.增强了程序的扩展性,降低了程序的耦合性(解耦)
- 实现Runnable接口的方式,把设置线程任务和开启新线程进行了分离(解耦)
- 实现类中,重写了run方法:用来设置线程任务
- 创建Thread类对象,调用start方法:用来开启新线程
写在最后
好了,关于多线程创建的两种方法我们就一起学习到这里。如果觉得有帮助别忘了给个赞哦。