一:前言
多线程在java中具有举足轻重的地位,无论是平时开发中还是面试求职中,对多线程这一块的知识点考察都非常多的,本周我们将平时开发中、面试中常见的一些多线程知识进行梳理,让大家对这一块有更加深入的理解
二:多线程应用场景
2.1:多线程的定义
多线程是指在一个程序中同时运行多个线程,每个线程都是独立的执行流程,可以在同一时间内执行不同的任务,从而提高程序的并发性和效率。
2.2:多线程应用场景
1:后台任务,比如定时推送1000W+短信
2:异步计算,如发微博、记录日志、耗时计算
3:分布式计算,通过多线程实现分布在不同机器上的任务协同工作。
4:数据分析:对于大数据集的分析,由于单线程处理可能太慢,因此可能需要使用多线程来加速这个过程。
5:多步骤的任务处理:根据任务的不同阶段和特性,使用多线程来协调不同的任务流程。
2.3:多线程的意义
1:提高效率:通过多线程可以把任务分解成多个,每个线程之间互不干扰,提高整体效率
2:提高并发性和响应能力:Java多线程允许程序在同一时间执行多个任务,可以充分利用计算机的多核处理器,提高程序的性能和响应速度。
三:多线程的技术应用
3.1 java中的基础实现
通过继承Thread类或者实现Runnable接口实现多线程,案例代码如下
public class ReadingThread extends Thread{
private String name;
private Integer age;
public ReadingThread(String name,Integer age){
this.name=name;
this.age=age;
}
@Override
public void run() {
System.out.println("当前姓名:"+name+",age="+age);
}
}
public class ReadingThread extends Thread{
private String name;
private Integer age;
public ReadingThread(String name,Integer age){
this.name=name;
this.age=age;
}
@Override
public void run() {
System.out.println("当前姓名:"+name+",age="+age);
}
}
public class ReaddingCallable implements Callable<String> {
@Override
public String call() throws Exception {
return null;
}
}
public static void main(String[] args) {
System.out.println(1<<30);
ReadingThread thread=new ReadingThread("aa",100);
thread.start();
Thread.currentThread().setPriority(1);
ReaddingRunnable readdingRunnable=new ReaddingRunnable("cc",200);
Thread thread2=new Thread(readdingRunnable);
thread2.start();
ReaddingCallable callable=new ReaddingCallable();
FutureTask futureTask=new FutureTask(callable);
Thread thread3=new Thread(futureTask);
thread3.start();
Object result = futureTask.get();
}
3.2.线程的生命周期
3.3:线程中的常用的函数说明
Thread thread8=new Thread();
//启动一个线程,
thread8.start();
//执行当前线程,并不会新开线程
thread8.run();
//java线程优先级设置 范围在1-10 1为最低 10为最高,默认创建是5,
// cpu会按照优先级进行分配资源
thread8.setPriority(5);
//当前线程加入等待,等当前线程执行完毕,在执行主线程
thread8.join();
//设置中断状态,设置为已中断
thread8.interrupt();
//获取中断状态
thread8.isInterrupted();
//恢复中断状态
Thread.interrupted();
//如何优雅停止线程?一种常见的方法是使用中断机制
Thread.sleep(100);
3.4:如何优雅停止线程
在Java中优雅地停止线程通常意味着让线程自愿停止执行,而不是使用强制(例如Thread.stop())方法。
class GracefulStoppable extends Thread {
private volatile boolean running = true;
@Override
public void run() {
while (running) {
// 执行任务
// ...
// 检查是否有中断请求
if (Thread.currentThread().isInterrupted()) {
// 清理资源或执行停止逻辑
// ...
break;
}
}
}
public void stopGracefully() {
running = false;
interrupt(); // 触发中断状态
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
GracefulStoppable thread = new GracefulStoppable();
thread.start();
// 执行其他操作...
// 当需要优雅停止线程时
thread.stopGracefully();
thread.join(); // 等待线程终止
}
}
3.5:线程安全
线程安全是编程中的术语,指某个函数、函数库在并发环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。
详细参考:详解什么是线程安全?-CSDN博客
3.6:并发集合
1:ConcurrentHashMap原理解析
深入解析ConcurrentHashMap:感受并发编程智慧 - 掘金
2:CopyOnWriteArrayList原理解析
CopyOnWriterArrayList 详解_copyonwritearraylist-CSDN博客
3:ConcurrentLinkedQueue原理解析
https://www.cnblogs.com/kukuxjx/p/18012960
4:ConcurrentSkipListSet原理解析
Java并发基础:ConcurrentSkipListSet全面解析!_java concurrentskiplistset-CSDN博客
5:ConcurrentSkipListMap原理解析
6:BlockingDeque接口的实现类
3.7:countdownlatch和cyclicbarrier原理
countdownlatch和cyclicbarrier原理详解-CSDN博客
3.8:complatefuture原理解析
CompletableFuture实现异步编排全面分析和总结 - 知乎