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

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
可观测链路 OpenTelemetry 版,每月50GB免费额度
简介: 【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();
    }
}

实现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();
    }
}

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();
            }
        }
    }
}

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

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

目录
相关文章
|
2天前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
16 0
|
2天前
|
存储 安全 Java
【数据保护新纪元】Java编程:揭秘黑客攻击背后的防线,打造坚不可摧的安全堡垒!
【8月更文挑战第30天】本文全面介绍了Java安全性编程的基本概念和实战技巧,涵盖输入验证、错误处理、数据加密、权限控制及安全审计等方面。通过具体示例,帮助开发者有效预防安全风险,提升程序的稳定性和可靠性,保护用户数据安全。适合希望提升Java应用安全性的开发者参考。
13 4
|
2天前
|
IDE Java 测试技术
揭秘Java高效编程:测试与调试实战策略,让你代码质量飞跃,职场竞争力飙升!
【8月更文挑战第30天】在软件开发中,测试与调试对确保代码质量至关重要。本文通过对比单元测试、集成测试、调试技巧及静态代码分析,探讨了多种实用的Java测试与调试策略。JUnit和Mockito分别用于单元测试与集成测试,有助于提前发现错误并提高代码可维护性;Eclipse和IntelliJ IDEA内置调试器则能快速定位问题;Checkstyle和PMD等工具则通过静态代码分析发现潜在问题。综合运用这些策略,可显著提升代码质量,为项目成功打下坚实基础。
|
2天前
|
Java 开发者 UED
【揭秘Java编程新境界】事件驱动:如何在Java中捕捉每一个关键瞬间?
【8月更文挑战第30天】事件驱动编程是一种编程范式,使程序能在事件发生时响应,而非按严格顺序执行。本文介绍Java中的事件驱动编程,包括基本概念、优势及其实现方法。通过事件监听器和事件对象,Java能够高效处理GUI、网络编程和游戏开发中的各种事件。文中还提供了创建事件监听器、自定义事件及处理多个事件源的示例代码,帮助读者更好地理解和应用这一强大的编程范式。
|
2天前
|
Java 开发者
在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选
在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选。相比 `synchronized`,Lock 提供了更灵活强大的线程同步机制,包括可中断等待、超时等待、重入锁及读写锁等高级特性,极大提升了多线程应用的性能和可靠性。通过示例对比,可以看出 Lock 接口通过 `lock()` 和 `unlock()` 明确管理锁的获取和释放,避免死锁风险,并支持公平锁选择和条件变量,使其在高并发场景下更具优势。掌握 Lock 接口将助力开发者构建更高效、可靠的多线程应用。
8 2
|
2天前
|
算法 Java 程序员
探索代码之美——从小白到大牛的编程旅程深入理解Java中的异常处理机制
【8月更文挑战第29天】编程,一门看似神秘而复杂的艺术,实则充满无限可能与创造的乐趣。本文将带你走进编程的世界,从最初的迷茫与困惑,到逐步掌握编程思维,再到深入理解代码背后的哲学,一起见证一个编程小白如何成长为技术大牛的奇妙旅程。
|
12月前
|
Java
Java接口和抽象类
Java接口和抽象类
76 0
|
10天前
|
设计模式 Java
【惊天揭秘】Java编程绝技大曝光:接口、抽象类、静态类与非静态类的神秘面纱终被揭开!
【8月更文挑战第22天】Java支持面向对象编程,通过接口、抽象类、静态类(如枚举与工具类)及普通类实现设计原则。接口定义行为规范,允许多重继承;抽象类含未实现的抽象方法,需子类完成;静态类常为工具类,提供静态方法;普通类则实例化对象。恰当运用这些结构能提升程序质量。
24 2
|
4月前
|
设计模式 搜索推荐 Java
java接口和抽象类的区别,以及使用选择
java接口和抽象类的区别,以及使用选择
44 0
|
3天前
|
Java 开发者
Java中的接口和抽象类
Java中的接口和抽象类
15 3
下一篇
云函数