浅谈Java的两种多线程实现方式

yizhihongxing

浅谈Java的两种多线程实现方式

多线程是Java中非常重要的特性之一,它可以充分利用计算机的多核资源,在同一个应用程序中同时执行多个任务,提高程序的并发性和性能。Java在实现多线程方面提供了两种方式:继承Thread类和实现Runnable接口。以下分别进行详细讲解。

继承Thread类

继承Thread类是实现多线程的最简单方法,只需要继承Thread类并重写其run()方法即可。run()方法包含了线程的具体执行逻辑。下面是一个简单的继承Thread类的示例:

public class MyThread extends Thread {

    @Override
    public void run() {
        System.out.println("MyThread is running...");
    }
}

在上面的示例代码中,我们定义了一个MyThread类继承了Thread类,并重写了其run()方法。在主线程中,我们可以创建一个MyThread对象并调用其start()方法来启动子线程:

public static void main(String[] args) {
    MyThread t = new MyThread();
    t.start();
    System.out.println("Main thread is running...");
}

上述代码输出结果为:

Main thread is running...
MyThread is running...

在上述代码中,子线程和主线程是并行执行的。通过开启子线程,我们可以实现多个任务的并行执行,提高程序的效率。

实现Runnable接口

实现Runnable接口是另一种实现多线程的方式。与继承Thread类不同,实现Runnable接口可以避免单继承的限制,以及Thread类可能带来的其他一些问题。同样,我们需要在自定义的类中重写run()方法来实现线程的具体逻辑。下面是一个简单的实现Runnable接口的示例:

public class MyRunnable implements Runnable {

    @Override
    public void run() {
        System.out.println("MyRunnable is running...");
    }
}

与继承Thread类的方式相比,我们需要使用Thread类来包装MyRunnable类,并调用其start()方法来启动子线程:

public static void main(String[] args) {
    MyRunnable r = new MyRunnable();
    Thread t = new Thread(r);
    t.start();
    System.out.println("Main thread is running...");
}

输出结果与上述继承Thread类的示例相同。

实现Runnable接口的优势在于,我们可以通过一个Runnable对象启动多个线程,因为它不会改变任何全局状态。此外,Runnable接口还可以实现线程的复用和资源共享。例如,可以创建多个Thread对象并将同一个Runnable对象传递给它们。

示例说明

下面是另一个继承Thread类的例子,展示了如何同时启动多个线程,并阻塞主线程等待子线程结束:

public class MyThread extends Thread {
    private int count;

    public MyThread(int count) {
        this.count = count;
    }

    @Override
    public void run() {
        for (int i = 0; i < count; i++) {
            System.out.println("Thread " + getId() + " : " + i);
        }
    }
}

public static void main(String[] args) {
    int n = 3;
    Thread[] threads = new Thread[n];
    for (int i = 0; i < n; i++) {
        threads[i] = new MyThread(5);
        threads[i].start();
    }
    // 等待所有子线程执行完毕
    for (Thread thread : threads) {
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    System.out.println("All threads finished.");
}

在上面的示例中,我们定义了一个MyThread类,实现了一个简单的计数器,每个线程可以指定计数的次数。在主线程中,我们创建了3个线程,并分别启动它们。在启动完所有子线程之后,主线程需要等待每个子线程都执行完毕后再继续执行。我们可以使用Thread类的join()方法来实现等待。最后,主线程输出“All threads finished.”。

在下面的示例中,我们用一个实现Runnable接口的类来演示如何在线程之间共享变量:

public class MyRunnable implements Runnable {
    private int count;

    public MyRunnable(int count) {
        this.count = count;
    }

    @Override
    public void run() {
        for (int i = 0; i < count; i++) {
            System.out.println(Thread.currentThread().getName() + " : " + i);
        }
    }
}

public static void main(String[] args) {
    int n = 3;
    MyRunnable runnable = new MyRunnable(5);
    for (int i = 0; i < n; i++) {
        Thread thread = new Thread(runnable);
        thread.setName("Thread-" + i);
        thread.start();
    }
}

在上面的示例中,我们定义了一个MyRunnable类,实现了一个简单的计数器。在主线程中,我们创建了3个线程,并将同一个MyRunnable对象传递给它们。三个线程共享同一个计数器,并且在线程内部通过Thread.currentThread().getName()获取了当前线程的名字。最终输出结果类似于:

Thread-0 : 0
Thread-1 : 0
Thread-2 : 0
Thread-0 : 1
Thread-1 : 1
Thread-2 : 1
...

在以上示例中,我们分别使用了继承Thread类和实现Runnable接口的方式实现了多线程。无论采用哪种方式,我们都需要定义一个run()方法,并在其中编写线程的具体逻辑。此外,我们还可以使用join()方法等待子线程执行完毕,以及使用synchronized关键字实现线程同步。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈Java的两种多线程实现方式 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • c++11&14-多线程要点汇总

    C++11&14-多线程要点汇总 在C++11和C++14标准中,多线程相关的API得到了极大的增强和改善,本文将总结介绍其中一些重要的关键点。 1. std::thread std::thread是C++11中线程的关键类型,用于创建和管理线程。可以使用std::thread的构造函数来创建一个新的线程: #include <iostream…

    多线程 2023年5月17日
    00
  • Java并发系列之AbstractQueuedSynchronizer源码分析(共享模式)

    我会给出完整的攻略。 Java并发系列之AbstractQueuedSynchronizer源码分析(共享模式) 前言 AbstractQueuedSynchronizer 是 Java 并发工具包中的一个重要组件,它提供了同步机制的底层实现,常被用于自定义同步器、锁以及其他相关工具的实现。其中,共享模式是 AQS 最为核心的实现之一。 AQS 共享锁机制 …

    多线程 2023年5月16日
    00
  • Java并发程序刺客之假共享的原理及复现

    Java并发程序刺客之假共享 1. 假共享的概念 假共享(False sharing)是指多个线程访问共享内存中不同的变量,但它们彼此之间共享了同一个缓存行(cache line),这样就会频繁地触发缓存一致性协议,导致性能下降。 缓存一致性协议(Coherence protocol)是指在多个处理器/核心之间共享缓存的时候保持数据一致的一种协议。常见的协议…

    多线程 2023年5月16日
    00
  • c语言多线程编程使用示例

    C语言多线程编程使用示例攻略 本文旨在介绍 C 语言多线程编程的使用方法和示例,帮助读者理解多线程的概念和实际应用场景。 多线程编程概述 多线程是指在单个程序中同时运行多个不同的线程,在操作系统中相对独立的执行流程。在多线程编程中,一个线程可以独立执行任务,也可以与其他线程协作完成任务。 多线程的优点 提高程序的并发性和并行性。 能够更好的利用多核处理器的性…

    多线程 2023年5月17日
    00
  • 详解JUC并发编程中的进程与线程学习

    详解JUC并发编程中的进程与线程学习攻略 一、进程与线程的概念及区别 进程:是指正在执行的程序的实例。每个进程都有独立的内存空间,它可以包括多个线程。 线程:是指程序中独立、并发执行的最小单位,它直接依赖于进程,一个进程可以创建多个线程。 进程与线程的最大区别在于进程是资源分配的最小单位,线程是CPU调度的最小单位。线程共享进程的内存空间以及其他系统资源。 …

    多线程 2023年5月16日
    00
  • Java并发之线程池Executor框架的深入理解

    Java并发之线程池Executor框架的深入理解 什么是Executor框架? Executor框架是Java提供的一种开发并发程序的机制。在Java中,通常我们需要实现多线程的程序来提高程序执行效率,但是如果使用Java中的Thread类直接去开启线程,可能会导致线程执行不可控、线程消耗过多的系统资源等问题。 Executor框架的出现解决了这些问题。它…

    多线程 2023年5月16日
    00
  • 详解java解决分布式环境中高并发环境下数据插入重复问题

    详解 Java 解决分布式环境中高并发环境下数据插入重复问题 背景 在高并发环境下,数据插入操作很容易出现重复插入的问题。例如,多个用户同时提交一个相同的表单,系统可能会将同样的数据插入数据库中多次,造成数据不一致的问题。这种情况在分布式环境下尤其常见,因为不同节点的时间戳可能不一致。 解决方案 方法一:利用 Unique 约束 在数据库中设置 Unique…

    多线程 2023年5月16日
    00
  • 4G内存服务器epoll并发量最大能达到多少?

    为了回答这个问题,我们需要一些背景知识。首先,我们需要知道什么是4G内存服务器,以及什么是epoll并发量。然后,我们还需要了解一些相关概念,例如TCP/IP协议,Linux内核等。 4G内存服务器是指内存大小为4GB的服务器。这种服务器通常用于轻量级的应用程序和小型网站。对于大型应用程序和高流量网站,需要更大的内存以及更强大的处理能力。 Epoll是Lin…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部