当前位置: 首页 > news >正文

线程相关个人笔记总结

什么是线程和进程

进程是一个程序的实例,线程是进程中的实体,一个进程有多个线程

线程的创建方式
1.继承 Thread 类重写 run() 

创建一个类继承自 Thread 类,并重写 run() 方法来定义线程执行的任务。

通过创建该类的实例并调用 start() 方法来启动线程。

class MyThread extends Thread {public void run() {// 线程执行的任务}
}
// 创建线程并启动
MyThread thread = new MyThread();
thread.start();

  

2.实现 Runnable 接口实现 run() 方法

创建一个实现 Runnable 接口的类,并实现其 run() 方法。

创建该类的实例,然后将其传递给一个新的 Thread 实例,并调用 start() 方法启动线程。

// 写法1:创建一个类实现 Runnable 接口实现 run() 方法
class MyRunnable implements Runnable {public void run() {// 线程执行的任务}
}
// 创建线程并启动
Thread thread = new Thread(new MyRunnable());
thread.start();// 写法2:使用匿名内部类在创建 Thread 或实现 Runnable 接口
Thread thread = new Thread(new Runnable() {public void run() {// 线程执行的任务}
});
thread.start();// 写法3: Lambda 表达式对匿名内部类方式进行简化
Thread thread = new Thread(() -> {// 线程执行的任务
});
thread.start();
3.使用 Callable 和 Future:

创建一个实现 Callable 接口的类,实现 call() 方法。

使用 ExecutorService 提交 Callable 任务,返回一个 Future 对象,通过 Future 获取线程执行的结果。

class MyCallable implements Callable<String> {public String call() {// 线程执行的任务return "Task completed!";}
}// 使用 ExecutorService 创建线程并启动
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(new MyCallable());
try {String result = future.get();System.out.println(result);
} catch (InterruptedException | ExecutionException e) {e.printStackTrace();
}
executor.shutdown();
线程生命周期
 public enum State {// 创建:Thread 实例刚刚被创建,但尚未开始执行。NEW,// 就绪:调用 start() 方法进入就绪状态,等待获取CPU时间片,// 获取后进入运行状态,开始执行run() 方法中的任务。RUNNABLE,// 阻塞:线程被阻塞,暂时停止执行,// 一般在获取锁(synchronized,ReentrantLock)时被其他线程占用,或是等待I/O操作完成会进入阻塞BLOCKED,// 等待:线程进入等待状态,需要被手动唤醒。// 调用 Object.wait()、Thread.join()、LockSupport.park() 等方法会使线程进入等待状态。WAITING,// 超时等待:线程等待一定时间后自动唤醒。// 调用 Thread.sleep(timeout)、Object.wait(timeout)、Thread.join(timeout) 等方法会使线程进入超时等待状态。TIMED_WAITING,// 终止:线程的生命周期结束,如线程执行完任务,或者出现异常而结束TERMINATED;}
什么是ThreadLocal,可以用来做什么,怎么使用

ThreadLocal是线程级别的变量容器。每个线程都可以独立访问自己的 ThreadLocal 变量,线程之间互不影响。

一般可以用来传参,或是多线程下需要实现线程局部变量

// 创建 ThreadLocal 变量:(创建类型有多种)
private static ThreadLocal<MyObject> myObjectThreadLocal = ThreadLocal.withInitial(() -> new MyObject());
ThreadLocal.withInitial(() -> 0);
ThreadLocal.withInitial("wrxfxdd");(文本)
ThreadLocal.withInitial(() -> false);
ThreadLocal.withInitial(User:new);(对象)
ThreadLocal.withInitial(HashMap::new);(集合)// 设置线程局部变量的值
myObjectThreadLocal.set(new MyObject());
// 获取线程局部变量的值:
MyObject myObject = myObjectThreadLocal.get();
// 移除线程局部变量的值(
myObjectThreadLocal.remove();
什么是守护线程,用来做什么,怎么用

守护线程是在程序运行时在后台提供服务的线程。守护线程只有在普通线程全部结束后,jvm退出,才会终止

一般用来执行一些后台任务,如垃圾回收、内存管理等,例如,JVM 中的垃圾回收线程就是一个守护线程。但平时代码中很少用到,

Thread daemonThread = new Thread(() -> {while (true) {// 守护线程的逻辑}
});
daemonThread.setDaemon(true);
daemonThread.start();

 

线程类的常用方法
Thread.join(),(毫秒)

join是线程实例的方法,调用 join() 方法的这个实例线程会被阻塞,直到线程结束或者使用重载的join(时间)方法,如果超过该时间没有结束,当前线程就会继续执行。用于可以按照一定顺序执行线程任务

Thread.sleep(毫秒);

sleep()是Thread类直接调用的方法,会让当前线程(一般是主线程)进入超时等待状态,超过该时间自动恢复就绪状态,可用于模拟耗时,或debug比如异步是否生效等

notify(); notifyAll():

notify() notifyAll() 方法都是object类的,notify():如果有多个线程处于等待中,只会随机唤醒一个处于等待状态(通过wait()方法进入等待状态)的线程。notifyAll() :唤醒所有处于等待状态的线程。

 

object.wait(),(毫秒);

wait() 方法是object类的,会让当前线程会释放对象的锁(即释放 synchronized 同步块的锁),并进入等待状态,直到被相同对象的object调用 notify() 或 notifyAll() 唤醒,主要用于线程间的同步和通信

public class WaitNotifyExample {private final Object lock = new Object();private boolean flag = false;public void waitForFlag() throws InterruptedException {synchronized (lock) {while (!flag) {System.out.println("Waiting...");lock.wait();}System.out.println("Flag is true. Continue with the task.");}}public void setFlag() {synchronized (lock) {flag = true;lock.notifyAll();}}public static void main(String[] args) {WaitNotifyExample example = new WaitNotifyExample();Thread waitingThread = new Thread(() -> {try {example.waitForFlag();} catch (InterruptedException e) {Thread.currentThread().interrupt();}});Thread notifyingThread = new Thread(() -> {// Simulate some worktry {Thread.sleep(2000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}System.out.println("Setting the flag to true.");example.setFlag();});waitingThread.start();notifyingThread.start();}
}

 

注意事项

使用 wait() 方法,线程必须通过synchronized获取对象的锁,否则运行时会抛出 IllegalMonitorStateException 异常(因为wait()方法是Object类的方法,它要求在对象的监视器(即通过synchronized关键字获取锁而ReentrantLock是juc下的实现,不是Object子类)

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【人工智能专栏】Xavier initialization合理的初始化权值
  • python XML2SRS
  • JVM虚拟机底层原理和机制
  • 新手教学系列——使用 Redis 实现任务队列:先进先出和后进先出的选择
  • html实现好看的塔罗牌、十二星座运势网站源码
  • IDEA如何去掉编辑框右侧的竖线
  • 【代码管理系列】2. 项目开发过程中我们的技术债是如何生成的,技术债你知多少
  • IP地址申请SSL证书的详细流程(ip地址实现https访问)
  • 了解MVCC
  • 从零安装pytorch并在pycharm中使用
  • 全面对比与选择指南:pgvector与Milvus向量数据库
  • Unity3D 物体圆周运动
  • 利用HttpServlet完成MySql数据库my_user表的登录校验
  • 算法学习day29
  • AWS生成式AI项目的全生命周期管理
  • $translatePartialLoader加载失败及解决方式
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【mysql】环境安装、服务启动、密码设置
  • 10个最佳ES6特性 ES7与ES8的特性
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • HTML5新特性总结
  • JS+CSS实现数字滚动
  • js作用域和this的理解
  • maven工程打包jar以及java jar命令的classpath使用
  • MobX
  • python学习笔记-类对象的信息
  • Python学习之路16-使用API
  • Vue小说阅读器(仿追书神器)
  • 诡异!React stopPropagation失灵
  • 简析gRPC client 连接管理
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 老板让我十分钟上手nx-admin
  • 浏览器缓存机制分析
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 深度解析利用ES6进行Promise封装总结
  • 数据可视化之 Sankey 桑基图的实现
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​configparser --- 配置文件解析器​
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​马来语翻译中文去哪比较好?
  • #Linux(权限管理)
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (1)Android开发优化---------UI优化
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (SpringBoot)第二章:Spring创建和使用
  • (汇总)os模块以及shutil模块对文件的操作
  • (力扣题库)跳跃游戏II(c++)
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (七)理解angular中的module和injector,即依赖注入
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程