创建多线程
步骤如下:
- 定义一个Runnable接口的实现类,并重写接口中的run()方法,该run()方法的方法体同样是该线程的线程执行体。
- 创建Runnable实现类的实例,并且以此实例为Thrad的target来创建Thread对象,该Thread对象才是真正的线程对象。
- 调用线程对象start()方法来启动线程。
Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。
实现步骤:
- 创建一个Runnable接口的实现类
- 在实现类中重写Runnable接口的run()方法,设置线程任务
- 创建一个Runnable接口的实现类对象
- 创建Thread类对象,构造方法中传递Runnable接口的实现类对象
- 调用Thread类中的start方法,开启新线程执行run方法。
实例代码:
//创建一个Runnable接口的实现类
public class RunnableClass implements Runnable{
//在实现类中重写Runnable接口的run()方法,设置线程任务
//线程任务是循环输出线程名称
@Override
public void run() {
for(int i=0;i<6;i++) {
System.out.println(Thread.currentThread().getName()+ "-->" + i);
}
}
}
public class Test {
public static void main(String[] args) {
//创建一个Runnable接口的实现类对象
RunnableClass run = new RunnableClass();
//创建Thread类对象,构造方法中传递Runnable接口的实现类对象
Thread t = new Thread(run);
//调用Thread类中的start方法,开启新线程执行run方法。
t.start();
for(int i=0;i<6;i++) {
System.out.println(Thread.currentThread().getName() + " --->" + i);
}
}
}
输出结构:
Thread和Runnable的区别
实现Runnable接口创建多线程的好处:
- 避免了单继承的局限性,因为一个类只能继承一个父类,所以如果用Thraed就不能再继承别的类,而Runnable是接口,实现接口还可以继承别的类
- 增强了程序的扩展性,需要使用Runnable定义的多线程时,只需在Thread对象的构造方法中传递Runnable实现类的对象。把设置线程任务和开启新线程进行了分离。降低了程序的耦合性。
匿名内部类方式实现线程的创建
匿名:即没有定义名字
内部类:写在其他类内部的类
主要目的是简化代码;把子类继承父类,重写父类方法,创建子类对象集合到一步中完成。
把实现类实现接口,重写接口中的方法,创建实现类对象合成一步完成。 匿名内部类的最终产物:子类/实现类对象,而这个类的没有名字。
实例代码:
public class ThreadInClass {
public static void main(String[] args) {
//线程的父类是Thread类
new Thread() {
//重写run方法,设置线程任务
@Override
public void run() {
for(int i=0;i<=6;i++) {
System.out.println(Thread.currentThread().getName() + "--->" + "第一个线程");
}
}
}.start();
//线程的接口Runnable
//
Runnable r = new Runnable() {
@Override
public void run() {
for(int i=0;i<=6;i++){
System.out.println(Thread.currentThread().getName() + " --> " + "第二个线程");
}
}
};
new Thread(r).start();
new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<=6;i++){
System.out.println(Thread.currentThread().getName() + " --> " + "第三个线程");
}
}
}).start();
}
}