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

相关推荐
码里法1 小时前
springmvc用配置类替换xml配置
java·spring·mvc
lizi888881 小时前
打包Python代码的常用方法实现程序exe应用
开发语言·python
api茶飘香2 小时前
守护应用边界:通过反射API实现安全的输入输出过滤
java·开发语言·python·安全·django·virtualenv·pygame
杀死一只知更鸟debug2 小时前
策略模式的小记
java·开发语言·策略模式
nice666602 小时前
CSS的基本语法
java·前端·css·visual studio code
efls1112 小时前
Qt_了解Qt Creator
开发语言·qt
请揣满RMB2 小时前
Qt常用控件——QRadioButton和QCheckBox
开发语言·c++·qt
阿巴~阿巴~2 小时前
C_深入理解指针(五) —— sizeof和strlen的对比、数组和指针笔试题解析、指针运算笔试题解析
c语言·开发语言·数据结构·算法
sco52822 小时前
【Shiro】Shiro 的学习教程(三)之 SpringBoot 集成 Shiro
spring boot·后端·学习
爱吃桃子的ICer3 小时前
[UVM]3.核心基类 uvm_object 域的自动化 copy() compare() print() pack unpack
开发语言·前端·ic设计