【JAVA学习之路 | 提高篇】创建与启动线程之二(继承Thread类)(实现Runnable接口)

简介: 【JAVA学习之路 | 提高篇】创建与启动线程之二(继承Thread类)(实现Runnable接口)

1.概述

java的JVM允许程序运行多个线程.使用java.lang.Thread来表示线程.一个线程都直接或间接的继承于Thread类,即每个线程的对象要么是Thread的实例,要么是其子类的实例.

2.Thread类的特性

  • 每个线程都是通过某个特定的Thread对象的run方法来完成操作的,run()被称为线程执行体.
  • 通过该线程对象的start()方法启动该线程,而非直接调用run方法(直接调用run()).
  • 调用start()有两方面作用 : 启动该线程,调用run()方法.
  • 要想实现多线程,则需要在主线程上创建新的线程对象.

3.方式1 : 继承Thread类

(1). 设计一个类并继承于Thread类.

(2). 重写Thread类的run()方法.

(3). 在主线程创建该子类的对象.

(4). 该对象调用start()启动线程.

例子 :

public class MulThread {
    public static void main(String[] args) {
        A a = new A();
        a.start();
        for (int i = 0; i <= 100 ; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + "\t" + i);
            }
        }
 
    }
}
 
class A extends Thread{
    public void run() {
        for (int i = 0; i <= 100; i++) {
            if (i % 2 == 1) {
                System.out.println(Thread.currentThread().getName() + "\t" +  i);
            }
        }
    }
}
 
控制台 : 
Thread-0  1
main  0
main  2
Thread-0  3
main  4
Thread-0  5
main  6
Thread-0  7
main  8
Thread-0  9
main  10

4.方式2 : 实现Runnable接口

正儿八经的写法 :

(1). 创建一个实现Runnable接口的实现类.


(2). 实现接口的run()方法,线程要执行的操作,在该方法体中.


(3). 创建这个实现类的对象.


(4). 将该对象作为参数传递到Thread类的构造器,创建Thread类的对象.


(5). 通过Thread类的对象调用start()方法,启动线程,运行当前线程的run()方法.


例子 : 使用匿名实现类的匿名对象.


注 : IDEA快捷键 : 重写(Override) : Ctrl+o

实现接口(implements) : Ctrl+i

public class RunnableTest {
    public static void main(String[] args) {
        //创建匿名实现类的匿名对象
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i <= 100; i++) {
                    if (i % 2 == 0) {
                        System.out.println(Thread.currentThread().getName() + "\t" + i);
                    }
                }
            }
        }).start();
        for (int i = 0; i <= 100; i++) {
            if (i % 2 == 1){
                System.out.println(Thread.currentThread().getName() + "\t" + i);
            }
 
        }
    }
}
 
控制台 : 
Thread-0  0
main  1
Thread-0  2
main  3
Thread-0  4
main  5
Thread-0  6
main  7
Thread-0  8
main  9
Thread-0  10
main  11

5.两种方式对比

(1). 共同点 :

  • 启动线程,都调用的是Thread类的start().
  • 创建的线程对象,都是Thread类的实例或其子类的实例.

(2). 不同点 :

  • 一个是类的继承,一个是类的实现.

(3). 使用Runnable接口的好处 :

  • 实现的方式避免了单继承的局限性.
  • 更适合处理有共享数据的问题.(Thread类的实参都引用同一个实现类)
  • 实现了代码和数据的分离.

(4). 明明调用的是Thread类的start(),为什么执行的是实现类实现的run()方法呢?


看源码 : Thread类的对象调用start()启动线程,调用Thread类的run()方法,Thread类有私有属性private Runnable target,target指向传入的实参(实现类)(此时再次体现了多态,接口类型的引用指向了实现类的对象),if(target !=null),那么调用的是target的run()方法.

相关文章
|
2月前
|
机器学习/深度学习 人工智能 NoSQL
JAVA接入DeepSeek大模型接口开发---阿里云的百炼模型
随着大模型的越来越盛行,现在很多企业开始接入大模型的接口,今天我从java开发角度来写一个demo的示例,用于接入DeepSeek大模型,国内的大模型有很多的接入渠道,今天主要介绍下阿里云的百炼模型,因为这个模型是免费的,只要注册一个账户,就会免费送百万的token进行学习,今天就从一个简单的可以执行的示例开始进行介绍,希望可以分享给各位正在学习的同学们。
297 3
JAVA接入DeepSeek大模型接口开发---阿里云的百炼模型
|
1月前
|
Java 编译器 API
Java Lambda 表达式:以 Foo 接口为例深入解析
本文深入解析了 Java 8 中 Lambda 表达式的用法及其背后的函数式接口原理,以 `Foo` 接口为例,展示了如何通过简洁的 Lambda 表达式替代传统匿名类实现。文章从 Lambda 基本语法、函数式接口定义到实际应用层层递进,并探讨默认方法与静态方法的扩展性,最后总结常见误区与关键点,助你高效优化代码!
57 0
|
1月前
|
Java
java中一个接口A,以及一个实现它的类B,一个A类型的引用对象作为一个方法的参数,这个参数的类型可以是B的类型吗?
本文探讨了面向对象编程中接口与实现类的关系,以及里氏替换原则(LSP)的应用。通过示例代码展示了如何利用多态性将实现类的对象传递给接口类型的参数,满足LSP的要求。LSP确保子类能无缝替换父类或接口,不改变程序行为。接口定义了行为规范,实现类遵循此规范,从而保证了多态性和代码的可维护性。总结来说,接口与实现类的关系天然符合LSP,体现了多态性的核心思想。
39 0
|
9月前
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
94 7
|
6月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
299 58
|
7月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
121 3
|
7月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
125 2
|
7月前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
143 1
|
9月前
|
Oracle 安全 Java
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
|
9月前
|
安全 Java
【Java集合类面试三】、Map接口有哪些实现类?
这篇文章介绍了Java中Map接口的几种常用实现类:HashMap、LinkedHashMap、TreeMap和ConcurrentHashMap,以及它们适用的不同场景和线程安全性。

热门文章

最新文章