【学习总结|DAY021】Java 多线程

embedded/2024/12/23 6:28:30/

多线程是Java编程中非常重要的概念,它允许程序同时执行多个任务,提高程序的执行效率。本文将详细介绍多线程的创建方式、常用方法、线程安全、线程同步、线程池以及并发和并行的概念,并结合代码案例进行讲解。

一、线程的创建方式

Java中创建线程主要有三种方式:

  • 方式一:继承Thread类
java">class MyThread extends Thread {@Overridepublic void run() {// 线程执行的任务}
}public class Main {public static void main(String[] args) {MyThread thread = new MyThread();thread.start(); // 启动线程}
}
  • 方式二:实现Runnable接口
java">class MyRunnable implements Runnable {@Overridepublic void run() {// 线程执行的任务}
}public class Main {public static void main(String[] args) {Thread thread = new Thread(new MyRunnable());thread.start(); // 启动线程}
}
  • 方式三:实现Callable接口
java">import java.util.concurrent.*;class MyCallable implements Callable<Integer> {@Overridepublic Integer call() throws Exception {// 线程执行的任务return 1; // 返回结果}
}public class Main {public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executor = Executors.newSingleThreadExecutor();Future<Integer> future = executor.submit(new MyCallable());Integer result = future.get(); // 获取线程执行结果executor.shutdown(); // 关闭线程池}
}

二、线程的常用方法

  • start(): 启动线程
  • run(): 线程执行的任务
  • getName(): 获取线程名称
  • setName(String name): 设置线程名称
  • currentThread(): 获取当前线程对象
  • sleep(long time): 使当前线程休眠指定时间
  • join(): 等待线程执行完毕

三、线程安全

当多个线程同时访问同一个共享资源时,可能会出现线程安全问题,导致程序出现错误。解决线程安全问题主要有三种方式:

  • 同步代码块: 使用synchronized关键字对访问共享资源的代码块进行加锁,确保同一时间只有一个线程可以访问该代码块。
java">synchronized (lock) {// 访问共享资源的代码
}
  • 同步方法: 使用synchronized关键字修饰方法,将整个方法体作为一个同步代码块。
java">public synchronized void method() {// 访问共享资源的代码
}
  • Lock锁: 使用Lock接口及其实现类ReentrantLock创建锁对象,进行加锁和解锁操作。
java">Lock lock = new ReentrantLock();
lock.lock(); // 加锁
try {// 访问共享资源的代码
} finally {lock.unlock(); // 解锁
}

四、线程池

线程池可以复用线程,避免频繁创建和销毁线程的开销,提高程序的执行效率。Java中创建线程池主要有两种方式:

  • 方式一:通过ThreadPoolExecutor创建线程池
java">ExecutorService executor = new ThreadPoolExecutor(3, // 核心线程数5, // 最大线程数60, // 临时线程存活时间TimeUnit.SECONDS, // 时间单位new LinkedBlockingQueue<Runnable>(), // 任务队列Executors.defaultThreadFactory(), // 线程工厂new ThreadPoolExecutor.AbortPolicy() // 任务拒绝策略
);
  • 方式二:通过Executors创建线程池
java">ExecutorService executor = Executors.newFixedThreadPool(3); // 创建固定大小的线程池
ExecutorService executor = Executors.newSingleThreadExecutor(); // 创建单线程的线程池
ExecutorService executor = Executors.newCachedThreadPool(); // 创建可缓存的线程池

五、并发和并行

  • 并发: 多个线程在同一时间段内交替执行。
  • 并行: 多个线程在同一时刻同时执行。

六、代码案例

以下是一个使用线程池执行任务的示例:

java">import java.util.concurrent.*;class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("线程 " + Thread.currentThread().getName() + " 执行任务");}
}public class Main {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(3);for (int i = 0; i < 10; i++) {executor.execute(new MyRunnable());}executor.shutdown();}
}

输出结果:

java">线程 pool-1-thread-1 执行任务
线程 pool-1-thread-2 执行任务
线程 pool-1-thread-3 执行任务
线程 pool-1-thread-1 执行任务
线程 pool-1-thread-2 执行任务
线程 pool-1-thread-3 执行任务
线程 pool-1-thread-1 执行任务
线程 pool-1-thread-2 执行任务
线程 pool-1-thread-3 执行任务
线程 pool-1-thread-1 执行任务

七、总结

多线程是Java编程中非常重要的概念,它可以帮助我们提高程序的执行效率。本文介绍了多线程的创建方式、常用方法、线程安全、线程同步、线程池以及并发和并行的概念,并结合代码案例进行讲解。希望读者能够掌握多线程的相关知识,并在实际开发中灵活运用。


http://www.ppmy.cn/embedded/148001.html

相关文章

如何解决vscode powershell乱码

如何解决vscode powershell乱码 在 Visual Studio Code 中使用 PowerShell 时出现乱码&#xff0c;通常是由于终端编码设置或字体不匹配导致的。以下是解决 PowerShell 乱码问题的步骤&#xff1a; 设置 PowerShell 的默认编码 PowerShell 默认的输出编码可能与终端编码不一…

电脑为什么会提示“msvcr120.dll丢失”?电脑找不到“msvcr120.dll文件“要怎么解决?

电脑为什么会提示“msvcr120.dll丢失”&#xff1f;遇到此问题该如何解决&#xff1f; 在我们使用电脑进行日常办公、学习或娱乐时&#xff0c;偶尔会遇到一些令人头疼的系统报错。其中&#xff0c;“msvcr120.dll丢失”这一提示&#xff0c;相信不少朋友都曾遇到过。这个看似…

Mybatis-plus-Join--分页查询

数据表四张&#xff1a; user&#xff1a; id,username,create_time,update_time product&#xff1a; id,name,price,number(库存),create_time,update_times order&#xff1a; id,quantity,order_time(下单时间),update_time order_detail:id,product_id,order_id,quant…

ELK系列-(五)指标收集-MetricBeat(下)

一、前文回顾 &#x1f50d; 在前面的ELK系列中&#xff0c;我们已经搭建了ELK的核心组件&#xff0c;包括&#xff1a; ELK系列-&#xff08;一&#xff09;Docker部署ELK核心组件ELK系列-&#xff08;二&#xff09;LogStash数据处理的瑞士军刀ELK系列-&#xff08;三&…

《庐山派从入门到...》板载按键启动!

《庐山派从入门到...》板载按键启动&#xff01; 《庐山派从入门到...》板载按键启动&#xff01; 视频内容大致如下 我们之前了解了GPIO的输出模式使用方法&#xff0c;并且成功点灯&#xff0c;很明显本篇要来分享的自然是GPIO的输入模式 正好回顾一下之前学的python基础包…

day14-16系统服务管理和ntp和防火墙

一、自有服务概述 服务是一些特定的进程&#xff0c;自有服务就是系统开机后就自动运行的一些进程&#xff0c;一旦客户发出请求&#xff0c;这些进程就自动为他们提供服务&#xff0c;windows系统中&#xff0c;把这些自动运行的进程&#xff0c;称为"服务" window…

基于MATLAB的图像增强

目录 一、背景及意义介绍背景图像采集过程中的局限性 意义 二、概述三、代码结构及说明&#xff08;一&#xff09;整体结构&#xff08;二&#xff09;亮度增强部分&#xff08;三&#xff09;对比度增强部分&#xff08;四&#xff09;锐度增强部分 四、复现步骤&#xff08;…

百度2021校招Web前端研发工程师笔试卷(第一批)

百度2021校招Web前端研发工程师笔试卷&#xff08;第一批&#xff09;2024/12/18 1.某主机的 IP 地址为 212.212.77.55&#xff0c;子网掩码为 255.255.252.0。若该主机向其所在子网发送广播分组&#xff0c;则目的地址可以是&#xff1f; 212.212.79.255 2.小牛在学习了二叉…