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

相关推荐
郑州光合科技余经理38 分钟前
PHP构建:支撑欧美澳市场的同城生活服务平台开发
java·开发语言·数据库·uni-app·php·排序算法·生活
لا معنى له5 小时前
目标检测的内涵、发展和经典模型--学习笔记
人工智能·笔记·深度学习·学习·目标检测·机器学习
石像鬼₧魂石7 小时前
内网渗透靶场实操清单(基于 Vulhub+Metasploitable 2)
linux·windows·学习·ubuntu
超级大只老咪8 小时前
数组相邻元素比较的循环条件(Java竞赛考点)
java
小浣熊熊熊熊熊熊熊丶8 小时前
《Effective Java》第25条:限制源文件为单个顶级类
java·开发语言·effective java
毕设源码-钟学长8 小时前
【开题答辩全过程】以 公交管理系统为例,包含答辩的问题和答案
java·eclipse
啃火龙果的兔子8 小时前
JDK 安装配置
java·开发语言
星哥说事8 小时前
应用程序监控:Java 与 Web 应用的实践
java·开发语言
派大鑫wink8 小时前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端
xUxIAOrUIII9 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端