java多线程方法整理

文章目录

  • [Java 多线程模型与方法介绍](#Java 多线程模型与方法介绍)
    • [1. Java 多线程模型:](#1. Java 多线程模型:)
      • [a. 线程基础概念:](#a. 线程基础概念:)
      • [b. 线程状态:](#b. 线程状态:)
      • [c. 线程调度:](#c. 线程调度:)
    • [2. 创建线程的两种方式:](#2. 创建线程的两种方式:)
    • [3. 线程同步与锁机制:](#3. 线程同步与锁机制:)
      • [a. 关键字 synchronized:](#a. 关键字 synchronized:)
      • [b. ReentrantLock:](#b. ReentrantLock:)
    • [4. 线程间通信:](#4. 线程间通信:)
    • [5. 线程池的使用:](#5. 线程池的使用:)
    • [6. 并发包(java.util.concurrent):](#6. 并发包(java.util.concurrent):)
      • [a. ConcurrentHashMap:](#a. ConcurrentHashMap:)
      • [b. CountDownLatch:](#b. CountDownLatch:)
      • [c. Semaphore:](#c. Semaphore:)

Java 多线程模型与方法介绍

在 Java 中,多线程编程是一项重要的技能,尤其是在处理并发任务、提高程序性能和响应性方面。以下是关于 Java 多线程模型和常用方法的介绍:

1. Java 多线程模型:

a. 线程基础概念:

线程(Thread): 是程序执行的最小单元,Java 中通过继承 Thread 类或实现 Runnable 接口来创建线程。

进程(Process): 是程序的一次执行,每个 Java 程序都至少有一个进程。

b. 线程状态:

新建(New): 线程被创建但尚未启动。

就绪(Runnable): 线程等待执行,具备执行条件。

运行(Running): 线程正在执行。

阻塞(Blocked): 线程等待某个条件的解除。

死亡(Dead): 线程执行完毕或被终止。

c. 线程调度:

Java 的线程调度由 JVM 的线程调度器负责。

yield() 方法可使当前线程让步给其他线程。

sleep() 方法可使线程休眠一段时间。

2. 创建线程的两种方式:

a. 继承 Thread 类:

java 复制代码
class MyThread extends Thread {
    public void run() {
        // 线程执行的代码
    }
}

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

b. 实现 Runnable 接口:

java 复制代码
class MyRunnable implements Runnable {
    public void run() {
        // 线程执行的代码
    }
}

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

3. 线程同步与锁机制:

a. 关键字 synchronized:

用于保护代码块或方法,防止多个线程同时执行该代码块或方法。

java 复制代码
class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }
}

b. ReentrantLock:

显示锁,提供了与 synchronized 类似的同步功能。

java 复制代码
import java.util.concurrent.locks.ReentrantLock;

class Counter {
    private int count = 0;
    private ReentrantLock lock = new ReentrantLock();

    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }
}

4. 线程间通信:

a. wait() 和 notify():

wait() 使线程等待,notify() 唤醒等待的线程。

java 复制代码
class SharedResource {
    boolean flag = false;

    synchronized void printNumber() {
        while (!flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("Print odd/even number");
        flag = !flag;
        notify();
    }

    synchronized void printAlphabet() {
        while (flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("Print alphabet");
        flag = !flag;
        notify();
    }
}

5. 线程池的使用:

a. Executor 框架:

ExecutorService 提供了一种管理和控制线程的方式。

java 复制代码
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 10; i++) {
            executorService.execute(() -> {
                // 线程执行的任务
            });
        }
        executorService.shutdown();
    }
}

6. 并发包(java.util.concurrent):

a. ConcurrentHashMap:

ConcurrentHashMap 是 HashMap 的线程安全版本,适用于多线程环境,提供了较好的并发性能。与传统的同步 HashMap 不同,ConcurrentHashMap 使用分段锁机制,将数据分成多个段,每个段上都有独立的锁,使得多线程可以并发地读取和写入不同的段,提高了并发性。

java 复制代码
import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapExample {
    public static void main(String[] args) {
        ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
        map.put("one", 1);
        map.put("two", 2);

        // 线程安全的读取
        int value = map.get("one");
        System.out.println("Value: " + value);

        // 线程安全的写入
        map.put("three", 3);
    }
}

b. CountDownLatch:

CountDownLatch 是一个同步辅助类,用于表示一个或多个线程等待一组事件的发生。它通过一个计数器来实现,初始值设定为需要等待的事件数量,每当一个事件发生时,计数器减一。当计数器为零时,所有等待的线程被唤醒。

java 复制代码
import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(3);

        Runnable task = () -> {
            // 执行任务
            System.out.println("Task completed");
            latch.countDown(); // 事件发生,计数器减一
        };

        // 启动多个线程执行任务
        new Thread(task).start();
        new Thread(task).start();
        new Thread(task).start();

        // 等待所有任务完成
        latch.await();
        System.out.println("All tasks completed");
    }
}

c. Semaphore:

Semaphore 是一个计数信号量,用于控制同时访问的线程数。它维护了一定数量的许可证,线程在访问临界区之前需要先获得许可证,执行完毕后释放许可证。

java 复制代码
import java.util.concurrent.Semaphore;

public class SemaphoreExample {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(2); // 允许两个线程同时访问

        Runnable task = () -> {
            try {
                semaphore.acquire(); // 获取许可证
                // 执行任务
                System.out.println("Task completed");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release(); // 释放许可证
            }
        };

        // 启动多个线程执行任务
        new Thread(task).start();
        new Thread(task).start();
        new Thread(task).start();
    }
}

以上是 Java 多线程模型和常用方法的简要介绍,深入理解这些概念和方法可以帮助你更好地设计和实现多线程应用,提高系统的并发性能。

针对多线程具体的方法放在这,持续更新中
java多线程方法整理
基于JDK1.8多线程常用解决方式-CyclicBarrier(循环栅栏)
基于JDK1.8多线程常用解决方式-CountDownLatch(倒计数器)
基于JDK1.8多线程常用解决方式-Semaphore (计数信号器)

相关推荐
不修×蝙蝠11 分钟前
Java 日志演进:一文读懂主流框架
java·log4j·logback·log4j2·日志·slf4j
robin_suli15 分钟前
数据库之多版本控制MVCC
java·数据库
我不是程序猿儿32 分钟前
【C#】WinForms 控件句柄与 UI 刷新时机
开发语言·ui·c#
十五年专注C++开发42 分钟前
Qt-Nice-Frameless-Window: 一个跨平台无边框窗口(Frameless Window)解决方案
开发语言·c++·qt
凯歌的博客1 小时前
python虚拟环境应用
linux·开发语言·python
鬼火儿1 小时前
Golang笔记——Interface类型
java·后端
蓝-萧1 小时前
Redis——Windows安装
java·后端
祈祷苍天赐我java之术1 小时前
如何在Java中整合Redis?
java·开发语言·redis
极小狐2 小时前
极狐GitLab 18.5 正式发布,更新 Maven 虚拟仓库 UI(Beta)、全新个人主页、实例级合规与安全策略管理 以及 DAST 认证脚本 等
java·gitlab·maven
王元_SmallA2 小时前
【玩转全栈】----Django基本配置和介绍
java·后端