创建线程的方式有两种:一种是继承Thread类,一种是实现Runnable接口
- 实现Runnable接口创建线程对象
步骤:
1. 定义Runnable接口的实现类,并重写该接口的run方法,该run方法的方法体同样是该线程的线程执行体
2. 创建Runnable接口实现类的实例,并以此实例作为Thread类的target来创建Thread类的对象,该Thread类的对象才是真正的线程对象
3. 调用线程对象的start()方法来启动新线程
代码:
// 实现Runnable接口实现类 实现了两个
package com.zhiyou100.thread.demo06;
// 1.定义一个Runnable接口的实现类
public class Demo02RunnableImpl implements Runnable{
// 2.在实现类中重写Runnable接口当中的run方法,设置线程任务。
@Override
public void run() {
// 循环20次,打印循环的次数
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName() + "--->" + i);
}
}
}
package com.zhiyou100.thread.demo06;
public class Demo03RunnableImpl implements Runnable{
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("hello World" + i);
}
}
}
package com.zhiyou100.thread.demo06;
/*
* 创建多线程程序的第二种方式:实现Runnable接口
* java.lang.Runnable:
* Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。
* lang.lang.Thread:
* Thread(Runnable target): 分配新的Thread类的对象
* Thread(Runnable target,String name):分配新的Thread类的对象
* 实现步骤:
* 1.定义一个Runnable接口的实现类
* 2.在实现类中重写Runnable接口当中的run方法,设置线程任务。
* 3.创建Runnable接口实现类的对象
* 4.构建Thread类的对象,在构造方法中传递Runnable接口的实现类对象
* 5.调用Thread类中的start方法,开启新线程执行run方法
* 实现Runnable接口创建多线程程序的好处:
* 1.避免了单继承的局限性
* 一个类只能直接继承一个父类,类继承了Thread类就不能继承其他的类
* 实现Runnable接口,还可以继承其他的类,还可以实现其他的接口
* 2.增强了程序的扩展性,降低了程序的耦合性(解耦)
* 实现Runnable接口的方式,把设置线程任务和开启新线程进行了分离(解耦)
* 实现类中,重写了run方法:用来设置线程的任务
* 创建Thread类的对象,调用start方法:用来开启新的线程
*
*/
public class Demo01Runnable {
public static void main(String[] args) {
//3. 创建Runnable接口实现类的对象
Runnable target = new Demo02RunnableImpl();// 多态写法
//4. 构建Thread类的对象,在构造方法中传递Runnable接口的实现类对象
Thread thread = new Thread(target);
//5. 调用Thread类中的start方法,开启新线程执行run方法
thread.start();
Thread thread2 = new Thread(new Demo03RunnableImpl());
thread2.start();
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName() + "--->" + i);
}
}
}
- 注意:
通过实现Runnable接口,是得该类有了多线程类的特征,run方法是多线程程序的一个执行目标,所有的多线程代码都写在run()方法中,Thread类实际上也是实现了Runnable接口的类
在启动的多线程的时候,需要先通过Thread类的构造方法Thread(Runnable target)构建线程对象,然后调用Thread类对象的start方法来运行多线程程序
备注:Runnable对象仅仅作为Thread类的对象的target,Runnable实现类包含了run方法作为线程的执行体。而实际的线程对象依然是Thread类的实例