Day19--Java多线程编程入门学习

1. 什么是多线程?

多线程是一种并发编程技术,它允许程序同时执行多个线程。线程是程序执行的基本单位,一个程序至少有一个线程,即主线程。通过使用多线程,可以在一个程序中同时处理多个任务,提高程序的效率和响应能力。

2. 为什么要使用多线程?
  • 提升性能:在多核处理器上,多线程可以将任务分配到不同的核心上,充分利用硬件资源,提高程序的执行速度。
  • 增强响应性:在用户界面程序中,使用多线程可以使主线程继续响应用户操作,而后台线程处理耗时的任务,避免程序"卡顿"。
  • 任务分离:将复杂的任务分解成多个线程,可以使程序结构更清晰,便于维护和管理。
3. 如何在Java中使用多线程?

Java提供了两种主要的方式来创建线程:

  1. 继承Thread

    通过继承Thread类并重写run()方法来定义线程的执行逻辑。

    java 复制代码
    public class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("Thread is running");
        }
    
        public static void main(String[] args) {
            MyThread thread = new MyThread();
            thread.start(); // 启动线程
        }
    }

    在这个例子中,MyThread类继承了Thread类,并重写了run()方法。调用start()方法来启动线程,run()方法中的代码会在新线程中执行。

  2. 实现Runnable接口

    实现Runnable接口并将其作为参数传递给Thread构造函数。

    java 复制代码
    public class MyRunnable implements Runnable {
        @Override
        public void run() {
            System.out.println("Runnable thread is running");
        }
    
        public static void main(String[] args) {
            Thread thread = new Thread(new MyRunnable());
            thread.start(); // 启动线程
        }
    }

    这里,MyRunnable实现了Runnable接口,并重写了run()方法。然后创建Thread对象,将MyRunnable实例传递给构造函数,并调用start()方法启动线程。

4. 线程的生命周期

线程在Java中有以下几种状态:

  • 新建(New) :线程对象创建后尚未调用start()方法。
  • 就绪(Runnable) :线程调用了start()方法,但尚未获得CPU时间片。
  • 运行(Running) :线程获得了CPU时间片并开始执行run()方法中的代码。
  • 阻塞(Blocked):线程在等待某些资源时被阻塞。
  • 等待(Waiting):线程处于无限期等待状态,直到被唤醒。
  • 超时等待(Timed Waiting):线程在等待指定时间后自动返回。
  • 终止(Terminated):线程执行完毕或因异常终止。
5. 线程同步

在多线程程序中,多个线程可能会访问共享资源,导致数据不一致。为了防止这种情况,Java提供了同步机制:

  • synchronized关键字:用于保证同一时刻只有一个线程可以访问被同步的代码块或方法。

    java 复制代码
    public class Counter {
        private int count = 0;
    
        public synchronized void increment() {
            count++;
        }
    
        public synchronized int getCount() {
            return count;
        }
    }

    在这个例子中,increment()getCount()方法被 synchronized修饰,确保在任何时候只有一个线程可以执行这些方法。

  • Lock接口 :提供了比synchronized更灵活的同步机制。

    java 复制代码
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class Counter {
        private int count = 0;
        private final Lock lock = new ReentrantLock();
    
        public void increment() {
            lock.lock();
            try {
                count++;
            } finally {
                lock.unlock();
            }
        }
    
        public int getCount() {
            lock.lock();
            try {
                return count;
            } finally {
                lock.unlock();
            }
        }
    }

    Lock接口提供了更多控制线程同步的功能,例如尝试获取锁或设置超时。

6. 线程的通信

线程之间可能需要协调工作。Java提供了以下方法来实现线程间通信:

  • wait() :使当前线程等待,直到其他线程调用notify()notifyAll()方法。

  • notify():唤醒一个正在等待的线程。

  • notifyAll():唤醒所有等待的线程。

    java 复制代码
    public class SharedResource {
        private boolean available = false;
    
        public synchronized void waitForResource() throws InterruptedException {
            while (!available) {
                wait();
            }
            available = false;
        }
    
        public synchronized void releaseResource() {
            available = true;
            notify();
        }
    }

    在这个例子中,waitForResource()方法会使线程等待,直到availabletruereleaseResource()方法则会通知等待的线程资源已可用。

7. 总结

多线程编程是Java中一个强大的特性,它能够提高程序的性能和响应能力。了解如何创建和管理线程,以及如何处理线程同步和通信,是编写高效并发程序的关键。掌握这些基础知识后,你可以进一步学习更高级的并发工具和设计模式,如线程池、并发集合等。

相关推荐
biter down10 分钟前
C 语言11:输入方法全解析
c语言·开发语言
爱倒腾的老唐11 分钟前
01、如何学习单片机
单片机·嵌入式硬件·学习
.格子衫.5 小时前
Spring Boot 原理篇
java·spring boot·后端
多云几多5 小时前
Yudao单体项目 springboot Admin安全验证开启
java·spring boot·spring·springbootadmin
于小汐在咯6 小时前
词根学习笔记 | Agri系列
笔记·学习
霜绛6 小时前
Unity:Json笔记——Json文件格式、JsonUtlity序列化和反序列化
学习·unity·json·游戏引擎
Jabes.yang7 小时前
Java求职面试实战:从Spring Boot到微服务架构的技术探讨
java·数据库·spring boot·微服务·面试·消息队列·互联网大厂
聪明的笨猪猪7 小时前
Java Redis “高可用 — 主从复制”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
执尺量北斗7 小时前
[特殊字符] 基于 Qt + OpenGL 实现的入门级打砖块游戏
开发语言·qt·游戏
夏子曦7 小时前
C#内存管理深度解析:从栈堆原理到高性能编程实践
开发语言·c#