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

相关推荐
IT技术分享社区6 分钟前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
极客代码9 分钟前
【Python TensorFlow】入门到精通
开发语言·人工智能·python·深度学习·tensorflow
疯一样的码农15 分钟前
Python 正则表达式(RegEx)
开发语言·python·正则表达式
代码之光_198016 分钟前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
As977_19 分钟前
前端学习Day12 CSS盒子的定位(相对定位篇“附练习”)
前端·css·学习
ajsbxi22 分钟前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
Rattenking22 分钟前
React 源码学习01 ---- React.Children.map 的实现与应用
javascript·学习·react.js
&岁月不待人&37 分钟前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
StayInLove41 分钟前
G1垃圾回收器日志详解
java·开发语言
对许44 分钟前
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“
java·log4j