Java一分钟:多线程编程初步:Thread类与Runnable接口

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 【5月更文挑战第11天】本文介绍了Java中创建线程的两种方式:继承Thread类和实现Runnable接口,并讨论了多线程编程中的常见问题,如资源浪费、线程安全、死锁和优先级问题,提出了解决策略。示例展示了线程通信的生产者-消费者模型,强调理解和掌握线程操作对编写高效并发程序的重要性。

多线程是Java中实现并发执行任务的关键特性。本文将简要介绍Java中创建线程的两种方式:继承Thread类和实现Runnable接口,并讨论常见问题、易错点及其避免策略。
image.png

1. 创建线程

继承Thread类

创建一个新类继承Thread,重写run()方法,然后创建该类的实例并调用start()启动线程。

public class MyThread extends Thread {
   
   
    @Override
    public void run() {
   
   
        // 线程执行逻辑
    }

    public static void main(String[] args) {
   
   
        MyThread thread = new MyThread();
        thread.start();
    }
}
AI 代码解读

实现Runnable接口

创建一个实现Runnable接口的类,重写run()方法,然后将Runnable实例传给Thread构造器。

public class MyRunnable implements Runnable {
   
   
    @Override
    public void run() {
   
   
        // 线程执行逻辑
    }

    public static void main(String[] args) {
   
   
        Thread thread = new Thread(new MyRunnable());
        thread.start();
    }
}
AI 代码解读

2. 常见问题与避免策略

  • 资源浪费:每个线程都占用一定的系统资源,过度创建线程可能导致资源浪费。合理评估线程数量,使用线程池管理线程。
  • 线程安全:多个线程共享数据可能导致数据不一致。使用synchronized关键字、volatile变量或Atomic类保证线程安全。
  • 死锁:多个线程相互等待对方释放资源,导致所有线程都无法继续。避免循环等待,使用超时或中断机制。
  • 优先级问题:线程优先级可能导致不公平的执行顺序。谨慎设置线程优先级,避免依赖优先级进行调度。

3. 示例:线程通信

public class ThreadCommunication {
   
   
    private int count = 0;

    public static void main(String[] args) {
   
   
        ThreadCommunication tc = new ThreadCommunication();
        Thread producer = new Thread(() -> tc.produce());
        Thread consumer = new Thread(() -> tc.consume());
        producer.start();
        consumer.start();
    }

    synchronized void produce() {
   
   
        for (int i = 0; i < 10; i++) {
   
   
            count++;
            System.out.println("Produced: " + count);
            try {
   
   
                Thread.sleep(100);
            } catch (InterruptedException e) {
   
   
                e.printStackTrace();
            }
        }
    }

    synchronized void consume() {
   
   
        for (int i = 0; i < 10; i++) {
   
   
            if (count == 0) {
   
   
                try {
   
   
                    wait();
                } catch (InterruptedException e) {
   
   
                    e.printStackTrace();
                }
            } else {
   
   
                count--;
                System.out.println("Consumed: " + count);
                notifyAll();
            }
        }
    }
}
AI 代码解读

以上代码展示了生产者-消费者模型,使用synchronizedwait()notifyAll()实现线程间通信。

总结,理解和掌握线程的创建方式,以及多线程编程中的问题和解决策略,是编写高效并发程序的基础。在实际开发中,合理使用线程池、同步机制和并发工具类,可以避免许多并发问题,提升程序性能。

目录
打赏
0
3
3
0
282
分享
相关文章
|
10天前
|
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
125 60
【Java并发】【线程池】带你从0-1入门线程池
|
6天前
|
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
当我们创建一个`ThreadPoolExecutor`的时候,你是否会好奇🤔,它到底发生了什么?比如:我传的拒绝策略、线程工厂是啥时候被使用的? 核心线程数是个啥?最大线程数和它又有什么关系?线程池,它是怎么调度,我们传入的线程?...不要着急,小手手点上关注、点赞、收藏。主播马上从源码的角度带你们探索神秘线程池的世界...
53 0
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
90 14
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
|
26天前
|
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
45 17
|
1月前
|
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
57 26
|
3月前
|
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
272 2
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####
Java多线程编程的陷阱与最佳实践####
本文深入探讨了Java多线程编程中常见的陷阱,如竞态条件、死锁和内存一致性错误,并提供了实用的避免策略。通过分析典型错误案例,本文旨在帮助开发者更好地理解和掌握多线程环境下的编程技巧,从而提升并发程序的稳定性和性能。 ####
|
3月前
|
多线程编程核心:上下文切换深度解析
在现代计算机系统中,多线程编程已成为提高程序性能和响应速度的关键技术。然而,多线程编程中一个不可避免的概念就是上下文切换(Context Switching)。本文将深入探讨上下文切换的概念、原因、影响以及优化策略,帮助你在工作和学习中深入理解这一技术干货。
65 10

云原生

+关注
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等