Thread创建线程的两种方式

一、第一种创建线程的方式

继承Thread类并重写run方法:

  1、创建一个继承Thread类的子类

  2、子类重写父类Thread类的run()方法

  3、创建Thread类的子类的对象

  4、通过此对象调用start()方法

复制代码
//创建线程的第一种方式
//1、创建一个继承Thread类的子类
class ThreadCreate_1 extends Thread{
    public static void main(String[] args) {
        //3、创建继承Thread类的子类的对象
        ThreadCreate_1 threadCreate1 = new ThreadCreate_1();
        //4、调用Thread类的子类对象的start()方法
        threadCreate1.start();
    }
    //2、子类重写Thread类的run方法
    @Override
    public void run() {
        super.run();
    }
}
复制代码

二、第二种创建线程的方法

实现Runnable接口:

  1、创建一个实现了Runnable的类

  2、实现类去实现Ru nnable中的抽象方法run()

  3、创建实现类的对象

  4、将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象

  5、通过Thread类的对象调用start()方法

复制代码
package com.gtguigu.java.Thread;

public class MyThread {
    public static void main(String[] args) {
        //3、创建实现类的对象
        ThreadCreate_2 threadCreate2 = new ThreadCreate_2();
        //4、将实现类的对象作为参数传递到Thread类的构造器中,创建Thread对象
        Thread thread = new Thread(threadCreate2);
        //5、通过Thread类的对象调用start();
        thread.start();
    }
}
//创建线程的第二种方式
//1、创建一个实现了Runnable接口的类
class ThreadCreate_2 implements Runnable{
    //2、实现Runnable的抽象方法run()
    @Override
    public void run() {
        System.out.println("创建线程二");
    }
}
复制代码

 原理:Thread构造函数将Runnable接口实现类引用到成员变量target中,在调用start方法时依旧是调用Thread自身的run方法,但是Thread中的run方法是这样写的:

三、两种创建方式的区别  

1、实现Runnable类的方式不会被类的单继承所限制;而继承Thread类的方式会被限制。

2、实现Runnable类的方式更利于多个线程拥有共享数据的情况,不需要使用静态变量就能实现多个线程数据共享。

注意:Thread类实际上也实现了Runnable类。

posted @   羽十六  阅读(364)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示