Thread和Runnable的区别

一、Thread和Runnable区别

Java中的thread和runnable都是与线程有关的概念,它们之间有什么区别呢?

thread是一个类,可以扩展Java类库,它在实现线程时必须重写run()方法。而runnable是一个接口,它只有一个run()方法需要重写。在实现线程时,通常使用Runnable接口。

//Thread示例
class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("Thread");
    }
}

//Runnable示例
class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("Runnable");
    }
}

public class Main {
    public static void main(String[] args){
        //创建Thread对象并启动线程
        MyThread myThread = new MyThread();
        myThread.start();

        //创建Runnable对象并启动线程
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

二、Runnable接口

Runnable接口是一个函数式接口,它只有一个run()方法需要重写,该方法定义了线程要执行的任务的代码逻辑。

实现Runnable接口相对于扩展Thread类更加灵活,因为Java是单继承的,如果扩展了Thread类那么该类就不能再扩展其他的类了,这给程序设计带来了极大的限制。另外,如果需要创建多个线程对象,那么要扩展Thread类需要去创建多个Thread的子类,而实现Runnable接口只需要创建多个Runnable类的实例对象即可。

//Runnable示例
class MyRunnable implements Runnable{
    @Override
    public void run() {
        for(int i = 0; i < 5; i++){
            System.out.println(Thread.currentThread().getName() + ":" + i);
            try{
                Thread.sleep(500);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}

public class Main {
    public static void main(String[] args){
        //创建Runnable对象并启动线程1
        MyRunnable myRunnable1 = new MyRunnable();
        Thread thread1 = new Thread(myRunnable1, "Thread-1");
        thread1.start();

        //创建Runnable对象并启动线程2
        MyRunnable myRunnable2 = new MyRunnable();
        Thread thread2 = new Thread(myRunnable2, "Thread-2");
        thread2.start();
    }
}

三、Runnable状态

线程状态是指一个线程在某一时刻的状态。Java中的线程有以下六种状态:

  1. New:新建状态,在线程创建后还没有启动时处于此状态
  2. Runnable:就绪状态,当线程调用start()方法后处于此状态
  3. Blocked:阻塞状态,线程暂停执行,等待某个条件满足后再继续执行
  4. Waiting:等待状态,线程等待其他线程的通知,不会自动恢复运行
  5. Timed Waiting:定时等待状态,线程等待其他线程的通知,等待一段时间后会自动恢复运行
  6. Terminated:终止状态,线程执行完毕或者抛出异常后处于此状态

Runnable状态是指线程正在执行中的状态。

import java.util.concurrent.TimeUnit;

//Runnable示例
class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("Runnable线程开始执行。。。");
        try{
            TimeUnit.SECONDS.sleep(5);
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("Runnable线程执行结束。。。");
    }
}

public class Main {
    public static void main(String[] args){
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();

        while(thread.isAlive()){
            System.out.println("线程正在执行中。。。");
            try{
                TimeUnit.SECONDS.sleep(1);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        System.out.println("线程执行完毕。。。");
    }
}

四、Thread和Runnable的选择

一般来说,如果只是简单的单线程程序,可以直接继承Thread类;如果是多线程程序,或者需要继承其他类的情况下,建议采用实现Runnable接口的方式。

Thread类在实现Runnable接口的基础上进行了封装,提供了更多的线程操作方法,适用于需要控制线程的详细信息的高级应用。而Runnable接口则更为简洁,更为灵活。

//Thread示例
class MyThread extends Thread{
    @Override
    public void run() {
        for(int i = 0; i < 5; i++){
            System.out.println(Thread.currentThread().getName() + ":" + i);
            try{
                sleep(500);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

//Runnable示例
class MyRunnable implements Runnable{
    @Override
    public void run() {
        for(int i = 0; i < 5; i++){
            System.out.println(Thread.currentThread().getName() + ":" + i);
            try{
                Thread.sleep(500);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

public class Main {
    public static void main(String[] args){
        //创建Thread对象并启动线程
        MyThread myThread = new MyThread();
        myThread.start();

        //创建Runnable对象并启动线程
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

五、总结

Java中的thread和runnable都是与线程有关的概念,其中thread是一个类,可以扩展Java类库,它在实现线程时必须重写run()方法;而runnable是一个接口,它只有一个run()方法需要重写。在实现线程时,通常使用Runnable接口。

Runnable接口相对于扩展Thread类更加灵活,因为Java是单继承的,如果扩展了Thread类那么该类就不能再扩展其他的类了,这给程序设计带来了极大的限制。另外,如果需要创建多个线程对象,那么要扩展Thread类需要去创建多个Thread的子类,而实现Runnable接口只需要创建多个Runnable类的实例对象即可。

线程的状态包括新建状态、就绪状态、阻塞状态、等待状态、定时等待状态和终止状态。Runnable状态指线程正在执行中的状态。

使用Thread类,则需要在类中直接实现run()方法;使用Runnable接口,需要在类中实现run()方法,并且需要创建一个Thread对象,将实现了Runnable接口的类传递给Thread对象的构造方法,并且调用start()方法启动线程。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/196042.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-03 09:52
下一篇 2024-12-03 09:52

相关推荐

  • Python中new和init的区别

    new和init都是Python中常用的魔法方法,它们分别负责对象的创建和初始化,本文将从多个角度详细阐述它们的区别。 一、创建对象 new方法是用来创建一个对象的,它是一个类级别…

    编程 2025-04-29
  • Sublime Test与Python的区别

    Sublime Text是一款流行的文本编辑器,而Python是一种广泛使用的编程语言。虽然Sublime Text可以用于编写Python代码,但它们之间有很多不同之处。接下来从…

    编程 2025-04-29
  • Shell脚本与Python脚本的区别

    本文将从多个方面对Shell脚本与Python脚本的区别做详细的阐述。 一、语法差异 Shell脚本和Python脚本的语法存在明显差异。 Shell脚本是一种基于字符命令行的语言…

    编程 2025-04-29
  • Java Thread.start() 执行几次的相关问题

    Java多线程编程作为Java开发中的重要内容,自然会有很多相关问题。在本篇文章中,我们将以Java Thread.start() 执行几次为中心,为您介绍这方面的问题及其解决方案…

    编程 2025-04-29
  • Python中while语句和for语句的区别

    while语句和for语句是Python中两种常见的循环语句,它们都可以用于重复执行一段代码。然而,它们的语法和适用场景有所不同。本文将从多个方面详细阐述Python中while语…

    编程 2025-04-29
  • Web程序和桌面程序的区别

    Web程序和桌面程序都是进行软件开发的方式,但是它们之间存在很大的区别。本文将从多角度进行阐述。 一、运行方式 Web程序运行于互联网上,用户可以通过使用浏览器来访问它。而桌面程序…

    编程 2025-04-29
  • TensorFlow和Python的区别

    TensorFlow和Python是现如今最受欢迎的机器学习平台和编程语言。虽然两者都处于机器学习领域的主流阵营,但它们有很多区别。本文将从多个方面对TensorFlow和Pyth…

    编程 2025-04-28
  • MySQL bigint与long的区别

    本文将从数据类型定义、存储空间、数据范围、计算效率、应用场景五个方面详细阐述MySQL bigint与long的区别。 一、数据类型定义 bigint在MySQL中是一种有符号的整…

    编程 2025-04-28
  • 麦语言与Python的区别

    麦语言和Python都是非常受欢迎的编程语言。它们各自有自己的优缺点和适合的应用场景。本文将从语言特性、语法、生态系统等多个方面,对麦语言和Python进行详细比较和阐述。 一、语…

    编程 2025-04-28
  • Python与C语言的区别和联系

    Python与C语言是两种常用的编程语言,虽然两者都可以用于编写软件程序,但是它们之间有很多不同之处。本文将从多个方面对Python与C语言的区别和联系进行详细的阐述。 一、语法特…

    编程 2025-04-28

发表回复

登录后才能评论