Java线程编程基础

一、什么是线程

线程是操作系统进行任务调度的最小单位。在Java中,线程是一种轻量级的进程,拥有自己的执行路径,可以与其他线程共享进程中的资源。

Java中的线程分为两类:用户线程和守护线程。其中,用户线程是进程中的主线程,当所有用户线程结束时,进程才会结束。守护线程则是为其他线程提供服务,当所有用户线程结束时,守护线程也会随之结束。

二、如何创建线程

Java中有两种方式可以创建线程:

1. 继承Thread类

public class MyThread extends Thread {
    public void run() {
        // 线程执行逻辑
    }
}

// 创建线程并启动
MyThread t = new MyThread();
t.start();

2. 实现Runnable接口

public class MyRunnable implements Runnable {
    public void run() {
        // 线程执行逻辑
    }
}

// 创建线程并启动
Thread t = new Thread(new MyRunnable());
t.start();

三、线程的状态

Java中的线程有6种状态:

1. 新建状态(New)

当创建线程对象时,线程处于新建状态。

2. 就绪状态(Runnable)

当线程被创建后,它将进入就绪状态,等待系统调度执行。

3. 运行状态(Running)

当线程获得CPU时间片后,它进入运行状态,在此状态下线程执行具体的任务。

4. 阻塞状态(Blocked)

当线程由于某些原因无法获得所需的资源时,它将进入阻塞状态,直到资源被释放。

5. 等待状态(Waiting)

当线程调用wait()方法等待某个条件满足时,它将进入等待状态,直到被唤醒。

6. 终止状态(Terminated)

当线程执行完毕或遇到异常时,它将进入终止状态。

四、线程同步

线程同步是指多个线程在访问共享资源时,通过互斥机制协调彼此之间的关系,以避免数据不一致或其他并发问题。

1. synchronized关键字

synchronized关键字是Java提供的最基本的线程同步机制,它可以用于修饰方法或代码块。使用synchronized关键字修饰后,同步对象(也称锁对象)将会成为区分线程的标志。

public synchronized void method() {
    // 有且仅有一条线程访问此方法
}

public void method() {
    synchronized (this) {
        // 有且仅有一条线程访问此代码块
    }
}

2. Lock接口

Lock接口也是一种线程同步机制,它提供了更加灵活和强大的同步方式。与synchronized关键字相比,Lock接口可以实现多个线程同时访问同一资源,通过tryLock方法可以避免死锁等问题。

Lock lock = new ReentrantLock();

public void method() {
    lock.lock();
    try {
        // 获得锁,执行线程同步代码
    } finally {
        lock.unlock();
    }
}

五、线程池

线程池是一种预先创建好的线程集合,在任务到来时,从集合中取出一个线程来处理任务,可以避免频繁创建和销毁线程,从而提升代码执行效率。

1. Executors类

Java提供了Executors工厂类,可以快速创建常用的线程池。Executors提供的线程池有以下几种:

a. newFixedThreadPool

创建一个固定大小的线程池,池中的线程数量始终不变。

ExecutorService executor = Executors.newFixedThreadPool(10);
executor.submit(new MyTask());
b. newCachedThreadPool

创建一个大小不受限制的线程池,池中线程数量可根据任务数量自动调整。

ExecutorService executor = Executors.newCachedThreadPool();
executor.submit(new MyTask());
c. newSingleThreadExecutor

创建一个单线程的线程池,它保证所有任务按顺序执行。

ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(new MyTask());

2. ThreadPoolExecutor类

除了Executors工厂类提供的线程池之外,还可以通过ThreadPoolExecutor类自定义线程池。ThreadPoolExecutor提供了非常灵活的线程池配置项,包括核心线程数、最大线程数、线程存活时间、拒绝策略等。

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    2, 5, 60, TimeUnit.SECONDS,
    new LinkedBlockingDeque(),
    new ThreadPoolExecutor.AbortPolicy()
);
executor.execute(new MyTask());

六、线程通信

线程通信是指多个线程之间通过共享变量进行数据传递和同步的过程。

1. wait()和notify()方法

wait()方法用于等待某个条件的发生,会使当前线程释放占有的锁,并进入等待队列中等待被唤醒。notify()方法用于唤醒等待在等待队列中的一个线程。

public synchronized void producer() throws InterruptedException {
    while (count == BUFFER_SIZE) {
        // 缓冲区已满,等待消费者消费
        wait();
    }
    
    // 生产数据
    buffer[in] = data;
    in = (in + 1) % BUFFER_SIZE;
    count++;
    
    // 唤醒等待在等待队列中的消费者
    notify();
}

public synchronized void consumer() throws InterruptedException {
    while (count == 0) {
        // 缓冲区为空,等待生产者生产
        wait();
    }
    
    // 消费数据
    data = buffer[out];
    out = (out + 1) % BUFFER_SIZE;
    count--;
    
    // 唤醒等待在等待队列中的生产者
    notify();
}

2. Condition接口

Condition接口是Java提供的高级线程同步机制,它可以让线程在等待某个条件满足时进入等待状态,而不是一直占用CPU资源。

Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();

public void method() throws InterruptedException {
    lock.lock();
    try {
        while (condition不满足) {
            condition.await();
        }
        
        // 线程执行逻辑
    } finally {
        lock.unlock();
    }
}

public void changeCondition() {
    lock.lock();
    try {
        // 改变condition的值
        condition.signalAll();
    } finally {
        lock.unlock();
    }
}

七、总结

Java线程编程是Java开发中必不可少的一部分,在并发编程中,线程的创建、状态、同步、池和通信等方面都需要掌握。对于初学者来说,建议从基础入手,逐渐提高对多线程编程的理解和实战经验。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/297953.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-28 12:17
下一篇 2024-12-28 12:17

相关推荐

  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Python基础代码用法介绍

    本文将从多个方面对Python基础代码进行解析和详细阐述,力求让读者深刻理解Python基础代码。通过本文的学习,相信大家对Python的学习和应用会更加轻松和高效。 一、变量和数…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29

发表回复

登录后才能评论