java中创建线程的两种方式有啥区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中创建线程的两种方式有啥区别相关的知识,希望对你有一定的参考价值。

java中创建线程的两种方式有什么区别

参考技术A 一种是继承 Thread 类,一种是 实现Runnable 接口,需要重写或者实现 run()方法。
没啥区别,因为java是单继承的,所以不可能让所有的类都继承Thread类,所以必须有这个Runnable 接口。

一般来说编程都会去 实现Runnble 接口,而不会采用继承Thread。

Java 中创建线程的两种方法实现

创建线程的两种方法:

  1. 继承Thread类,重写run方法
  2. 实现Runnable接口,重写run方法

一、继承Thread类,创建子线程
我们通过编写一个程序,来理解通过继承Thread类,来创建子线程
开启一个线程,在控制台输出“"喵喵,我是小猫咪”,当输出8次,结束该线程
具体代码如下,注释已经代码中给出,可以体会一下

public class Thread1 
    public static void main(String[] args) throws InterruptedException 
        //创建Cat对象,可以当做线程使用
        Cat cat = new Cat();

        /*
         public synchronized void start() 
                start0();
         
         start0()是本地方法,是JVM调用,底层是c/c++实现
         //真正实现多线程的效果,是start0,而不是run
         */
        cat.start(); //启动线程 ->最终会执行cat的run方法

        System.out.println("主线程继续执行:" + Thread.currentThread().getName()); //线程名main
        for (int i = 0; i < 10; i++) 
            System.out.println("主线程 i=:" + i);
            //让主线程休眠
            Thread.sleep(1000);
        
    




//1.当一个类继承了Thread类,该类就可以当做线程来使用
//2.我们会重写run方法,写了自己的业务代码
//3.run() 是Thread类,实现了Runnable接口的run方法
/*
    @Override
    public void run() 
        if (target != null) 
            target.run();
        
    

 */
class Cat extends Thread 
    int times = 0;

    @Override
    public void run()  //重写run方法,写上自己的逻辑代码
        while (true) 
            //线程名Thread-0
            System.out.println("喵喵,我是小猫咪" + (++times) + "线程名称:" + Thread.currentThread().getName());
            try 
                //让该线程休眠1秒 ctrl+alt+t
                Thread.sleep(1000);
             catch (InterruptedException e) 
                e.printStackTrace();
            
            if (times == 8) 
                break;
            
        
    

运行后的结果,可以看到主线程和子线程是交替执行的

二、实现Runnable接口,实现run方法
说明:java是单继承的,在某些情况下,一个类可能已经继承了一个父类,这时再用继承Thread类方法来创建线程显然是不可能了。
java设计者们提供了另外一个方法创建线程,就是通过实现Runnable接口来创建线程。

接下来编写一个程序来使用这个方法创建子线程,注释已经代码中给出

public class Thread2 
    public static void main(String[] args) 
        Dog dog = new Dog();
        //创建了Thread对象,把dog对象(实现Runnable接口),放入Thread
        Thread thread = new Thread(dog);
        thread.start();
    


class Dog implements Runnable  //通过实现Runnable接口,开发线程
    int count = 0;

    @Override
    public void run() 
        while (true) 
            System.out.println("hi" + (++count) + "线程名:" + Thread.currentThread().getName());
            try 
                //休眠1秒
                Thread.sleep(1000);
             catch (Exception e) 
                e.printStackTrace();
            
            if (count == 10) 
                break;
            
        
    

运行结果:

以上就是创建线程的两种方法的基本详解,有不当之处,还望各位指正~

以上是关于java中创建线程的两种方式有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

传统线程技术中创建线程的两种方式

并发技术01传统线程技术中创建线程的两种方式

创建线程有哪两种方法,它们各自的优缺点是啥?

Java 中创建线程的两种方法实现

java 线程最多能创建多少个

如何创建并运行java线程