Java多线程

简介: Java多线程


Java多线程

多线程是指同时执行多个线程的能力。Java提供了内置的多线程支持,使得开发者可以轻松地创建和管理多个并发执行的线程

多线程

Process

Process(进程)是指正在运行的一个程序实例;Java提供了Process类,用于创建和控制外部进程

Thread

Thread(线程)是指执行线程任务的单个执行单元;Java提供了Thread类,用于创建和管理线程

线程创建方式

继承Thread类

开发者可以创建一个继承自Thread类的子类,并重写其run()方法来定义线程的执行逻辑;然后通过创建该子类的实例,调用start()方法来启动线程

class MyThread extends Thread {
    public void run() {
        // 线程执行的逻辑
    }
}
public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start(); // 启动线程
    }
}
实现Runnable接口

开发者可以创建一个实现了Runnable接口的类,并实现其run()方法来定义线程的执行逻辑;然后通过创建该类的实例,将其作为参数传递给Thread类的构造函数,最后调用start()方法来启动线程

class MyRunnable implements Runnable {
    public void run() {
        // 线程执行的逻辑
    }
}
public class Main {
    public static void main(String[] args) {
        MyRunnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start(); // 启动线程
    }
}
实现Callable接口

Callable接口代表一个可以在当前线程中执行的代码块,但它可以返回结果;因此,Runnable接口适用于那些不需要返回结果的操作,而Callable接口适用于那些需要返回结果的操作

class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        // 在这里编写你的逻辑代码
        // 返回你的结果
        return 42;
    }
}
public class Main {
    public static void main(String[] args) throws Exception {
        // 创建一个线程池
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        // 创建一个Callable任务
        Callable<Integer> callable = new MyCallable();
        // 提交任务并获得一个Future对象
        Future<Integer> future = executorService.submit(callable);
        // 等待任务执行完成并获取结果
        Integer result = future.get();
        // 输出结果
        System.out.println("Result: " + result);
        // 关闭线程池
        executorService.shutdown();
    }
}

代理模式

Java的代理模式是一种结构型设计模式,它允许在不改变现有代码的情况下,为对象提供一个代理,以控制对该对象的访问。代理模式可以用于实现对象的“守卫”或“代理”,可以在运行时对对象的行为进行修改或增强

  • 抽象角色:代理角色和真实角色对外提供的公共方法,常是一个抽象数据类型或接口
  • 真实角色:需要实现抽象角色接口,定义真正所要实现的业务逻辑,以便代理角色调用
  • 代理角色:需要实现抽象角色接口,真实角色的代理,通过真实角色的业务逻辑来实现抽象方法,并可以附加自己的操作,将统一的流程控制都放到代理角色中处理

动态代理

动态代理是通过实现java.lang.reflect.Proxy接口来创建代理对象,代理对象可以在运行时动态地生成;动态代理通常用于实现AOP(面向切面编程)等场景

静态代理

静态代理(Static Proxy)是一种通过编写代码来拦截并修改对象行为的技术;静态代理使用Java字节码操作,可以在运行时生成代理类,对代理对象进行增强;静态代理主要使用Java反射机制实现

//抽象角色(手机厂家)
public interface PhoneFactory {
    void deliverGoods();
}
//真实角色
public class Xiaomi implements PhoneFactory {
    @Override
    public void deliverGoods() {
        System.out.println("小米手机....发货了");
    }
}
//真实角色
public class Huawei implements PhoneFactory {
    @Override
    public void deliverGoods() {
        System.out.println("华为手机....发货了");
    }
}
//代理角色
public class JD implements PhoneFactory {
    private PhoneFactory factory;
    public JD(PhoneFactory factory) {
        this.factory = factory;
    }
    private void sailBefore() {
        System.out.println("售前服务");
    }
    private void sailAfter() {
        System.out.println("售后服务");
    }
    //对真实角色的行为(方法)进行增强
    @Override
    public void deliverGoods() {
        sailBefore();
        factory.deliverGoods();
        sailAfter();
    }
}
//调用者
public class ShoppingTest {
    public static void main(String[] args) {
        PhoneFactory haier = new Huawei();
        JD jd = new JD(haier);
        jd.deliverGoods();
    }
}
//拓展需求,购买OPPO手机
public class OPPO implements PhoneFactory{
    @Override
    public void deliverGoods() {
        System.out.println("OPPO手机....发货了");
    }
}
//调用者
public class ShoppingTest {
    public static void main(String[] args) {
        Factory oppo = new OPPO();
        JD jd = new JD(oppo);
        jd.deliverGoods();
    }
}

线程方法

线程状态

多线程适用场景

  • 并发处理: 如果需要同时处理多个任务或请求,可以使用线程来并发执行这些任务。在 Java 中,可以使用 Thread 类或实现 Runnable 接口创建线程,并通过 start() 方法启动线程
  • 异步操作: 在某些情况下,需要进行异步操作,例如处理耗时的操作、IO 操作或网络请求。使用线程可以在后台执行这些操作,而不会阻塞主线程。在 Java 中,可以使用 ExecutorServiceCompletableFutureFutureTask 等来实现异步操作
  • 定时任务: 需要按照一定的时间间隔或时间表执行任务,可以使用线程来执行定时任务。在 Java 中,可以使用 TimerScheduledExecutorService 或第三方库如 Quartz 来执行定时任务
  • 并行计算: 在需要并行计算的场景中,可以使用线程来同时执行计算任务,从而加速处理速度。在 Java 中,可以使用 ExecutorServiceForkJoinPool 等来实现并行计算。
  • 多线程数据处理: 如果有大量的数据需要处理,可以使用多线程来并行处理数据。例如,将数据分割成多个部分,每个线程处理一个部分,并将结果合并。在 Java 中,可以使用 ExecutorServiceForkJoinPool、并发集合类等来实现多线程数据处理
  • 线程池: 在需要管理线程的创建、复用和销毁时,可以使用线程池来提高性能和资源利用率。线程池可以预先创建一组线程,并维护一个任务队列,以便在需要时执行任务。在 Java 中,可以使用 ExecutorServiceThreadPoolExecutor 来创建和管理线程池

🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——点赞👍收藏⭐️评论📝


目录
相关文章
|
8天前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
64 6
【Java学习】多线程&JUC万字超详解
|
2天前
|
Java 调度 开发者
Java并发编程:深入理解线程池
在Java的世界中,线程池是提升应用性能、实现高效并发处理的关键工具。本文将深入浅出地介绍线程池的核心概念、工作原理以及如何在实际应用中有效利用线程池来优化资源管理和任务调度。通过本文的学习,读者能够掌握线程池的基本使用技巧,并理解其背后的设计哲学。
|
1天前
|
缓存 监控 Java
Java中的并发编程:理解并应用线程池
在Java的并发编程中,线程池是提高应用程序性能的关键工具。本文将深入探讨如何有效利用线程池来管理资源、提升效率和简化代码结构。我们将从基础概念出发,逐步介绍线程池的配置、使用场景以及最佳实践,帮助开发者更好地掌握并发编程的核心技巧。
|
3天前
|
缓存 监控 Java
java中线程池的使用
java中线程池的使用
|
2天前
|
算法 Java 数据处理
Java并发编程:解锁多线程的力量
在Java的世界里,掌握并发编程是提升应用性能和响应能力的关键。本文将深入浅出地探讨如何利用Java的多线程特性来优化程序执行效率,从基础的线程创建到高级的并发工具类使用,带领读者一步步解锁Java并发编程的奥秘。你将学习到如何避免常见的并发陷阱,并实际应用这些知识来解决现实世界的问题。让我们一起开启高效编码的旅程吧!
|
7天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
4天前
|
Java 开发者
Java中的多线程编程基础与实战
【9月更文挑战第6天】本文将通过深入浅出的方式,带领读者了解并掌握Java中的多线程编程。我们将从基础概念出发,逐步深入到代码实践,最后探讨多线程在实际应用中的优势和注意事项。无论你是初学者还是有一定经验的开发者,这篇文章都能让你对Java多线程有更全面的认识。
14 1
|
11天前
|
Java 调度
Java中的多线程基础与实践
【8月更文挑战第31天】本文将深入浅出地讲解Java中多线程的基础知识,并通过实例展示如何在Java程序中实现多线程。我们将从多线程的基本概念出发,逐步深入到线程的创建、控制以及同步机制,最后通过一个简易版的生产者消费者模型来实践这些知识点。文章旨在帮助初学者快速掌握多线程编程的关键技能,并理解其背后的原理。
|
2天前
|
安全 Java UED
Java并发编程:解锁多线程的潜力
在Java的世界里,并发编程如同一场精心编排的交响乐,每个线程扮演着不同的乐手,共同奏响性能与效率的和声。本文将引导你走进Java并发编程的大门,探索如何在多核处理器上优雅地舞动多线程,从而提升应用的性能和响应性。我们将从基础概念出发,逐步深入到高级技巧,让你的代码在并行处理的海洋中乘风破浪。
|
11天前
|
传感器 C# 监控
硬件交互新体验:WPF与传感器的完美结合——从初始化串行端口到读取温度数据,一步步教你打造实时监控的智能应用
【8月更文挑战第31天】本文通过详细教程,指导Windows Presentation Foundation (WPF) 开发者如何读取并处理温度传感器数据,增强应用程序的功能性和用户体验。首先,通过`.NET Framework`的`Serial Port`类实现与传感器的串行通信;接着,创建WPF界面显示实时数据;最后,提供示例代码说明如何初始化串行端口及读取数据。无论哪种传感器,只要支持串行通信,均可采用类似方法集成到WPF应用中。适合希望掌握硬件交互技术的WPF开发者参考。
31 0