【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()方法.

相关文章
|
5天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
30 4
|
12天前
|
安全 Java
在 Java 中使用实现 Runnable 接口的方式创建线程
【10月更文挑战第22天】通过以上内容的介绍,相信你已经对在 Java 中如何使用实现 Runnable 接口的方式创建线程有了更深入的了解。在实际应用中,需要根据具体的需求和场景,合理选择线程创建方式,并注意线程安全、同步、通信等相关问题,以确保程序的正确性和稳定性。
|
9天前
|
Java 网络安全 Maven
Exception in thread "main" java.lang.NoSuchMethodError: okhttp3.OkHttpClient$Builder.sslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/X509TrustManager;)Lokhttp3/OkHttpClient$Builder; 问题处理
【10月更文挑战第26天】Exception in thread "main" java.lang.NoSuchMethodError: okhttp3.OkHttpClient$Builder.sslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/X509TrustManager;)Lokhttp3/OkHttpClient$Builder; 问题处理
31 2
|
15天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
27 2
|
15天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
27 2
|
1月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
38 1
C++ 多线程之初识多线程
|
15天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
13 3
|
15天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
12 2
|
15天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
26 1
|
15天前
|
安全 Java 开发者
Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用
本文深入解析了Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用。通过示例代码展示了如何正确使用这些方法,并分享了最佳实践,帮助开发者避免常见陷阱,提高多线程程序的稳定性和效率。
26 1