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

做网站的公司好坑啊广州网站优化推荐

做网站的公司好坑啊,广州网站优化推荐,信用信息公示网官网,中小企业网站积木式搭建你好#xff0c;我是 shengjk1#xff0c;多年大厂经验#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注#xff01;你会有如下收益#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么#xff0c;评论或者私信告诉我#xff01; 文章目录 一…你好我是 shengjk1多年大厂经验努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注你会有如下收益 了解大厂经验拥有和大厂相匹配的技术等 希望看什么评论或者私信告诉我 文章目录 一、前言二、join 和 ThreadLocal2.1 join 介绍2.1.1 join 作用和例子2.1.2 join 其他方法2.1.3 join 原理2.1.4 join 的使用场景 2.2 ThreadLocal 介绍2.2.1 ThreadLocal 作用和例子2.2.2 ThreadLocal 原理2.2.3 ThreadLocal 的使用场景2.2.4 ThreadLocal 注意 三、总结 一、前言 前面的几篇文章我们分别讲解了java多线程的基础知识、java 线程之间通信-volatile 和 synchronized 以及 java线程间的通信- notify和 wait本篇是java多线程通信的最后一篇join 和 ThreadLocal 二、join 和 ThreadLocal 2.1 join 介绍 2.1.1 join 作用和例子 如果一个线程A执行了thread.join()语句其含义是当前线程A等待thread线程终止之后才从thread.join() 返回。 如 public class ThreadJoin1 {public static void main(String[] args) throws InterruptedException {Thread thread new Thread(threadB) {Overridepublic void run() {try {TimeUnit.SECONDS.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}};thread.start();thread.join();System.out.println(threadB执行完成主线程继续往下执行);} }这里主线程会一直等待threadB执行完成才能继续往下执行 2.1.2 join 其他方法 线程Thread除了提供join()方法之外还提供了join(long millis)和join(long millis,int nanos)两个具备超时特性的方法。这两个超时方法表示如果线程thread在给定的超时时间里没有终止那么将会从该超时方法中返回 2.1.3 join 原理 //当 join 的时间为 0 时 if (millis 0) {while (isAlive()) {wait(0);} } else {while (isAlive()) {long delay millis - now;if (delay 0) {break;}wait(delay);now System.currentTimeMillis() - base;} }等待线程终止join()方法是用于让当前线程等待调用该方法的线程执行完毕。主调用线程会等待被调用线程的终止。具体来说调用join(millis)方法会使当前线程最多等待millis毫秒直到被调用线程结束设定超时为0表示永久等待而不是等待当前线程自己终止。实现机制join()方法的实现通常会使用this.wait()方法顺序地调用this.wait()并检查this.isAlive()条件以等待被调用线程的终止。当被调用线程终止时会调用notifyAll()方法来唤醒正在等待的线程让其继续执行。虽然源代码中无法找到join()方法内部的notifyAll()调用但可以肯定的是Java的多线程机制会确保在目标线程执行结束时等待的线程能够被正确唤醒。这种机制是由Java运行时环境在底层实现的 2.1.4 join 的使用场景 join() 方法是用于让一个线程等待另一个线程完成的方法。在Java中join() 方法通常用于以下应用场景 等待线程完成后再执行后续操作当一个线程需要等待另一个线程执行完成后才能继续执行可以使用 join() 方法。这在需要线程间协作的情况下很有用。多个线程按顺序执行如果有多个线程按照一定的顺序来执行可以使用 join() 方法使得后续的线程等待前一个线程完成之后再执行。线程任务协调当一个线程需要等待其他一组线程都完成后才能继续执行时在这组线程中每个线程可以在执行完自己的任务后调用join()方法主线程会等待所有这些线程执行完毕。实现线程间的数据交换通过join()方法一个线程可以等待另一个线程计算出结果或者产生数据从而实现多个线程间的数据交换。任务分解在复杂的任务分解中join() 可以用来等待各个子任务完成然后汇总结果。 举例来说假设我们有一个主线程需要等待两个子线程完成后再继续执行可以这样实现 public class JoinExample {public static void main(String[] args) {Thread thread1 new Thread(() - {// 执行一些任务System.out.println(Thread 1 finished);});Thread thread2 new Thread(() - {// 执行一些任务System.out.println(Thread 2 finished);});thread1.start();thread2.start();try {thread1.join(); // 主线程等待thread1完成thread2.join(); // 主线程等待thread2完成} catch (InterruptedException e) {e.printStackTrace();}// 所有线程都执行完毕后继续执行主线程System.out.println(All threads have finished);} }在这个例子中主线程会等待thread1 和 thread2 完成后才会继续执行。这种方式可以用于确保线程间的操作顺序性以及线程完成后的后续处理。 2.2 ThreadLocal 介绍 2.2.1 ThreadLocal 作用和例子 ThreadLocal即线程变量( 可以理解为是线程的私有变量每个线程一个所以不存在线程安全的问题 )是一个以ThreadLocal对象为键、任意对象为值的存储结构。这个结构被附带在线程上也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的一个值。 public class MyThreadLocalExample {private static ThreadLocalInteger threadLocal new ThreadLocal();public static void main(String[] args) {threadLocal.set(100); // 在当前线程设置值System.out.println(Main Thread Value: threadLocal.get());Thread thread new Thread(() - {threadLocal.set(200); // 在新线程设置值System.out.println(Child Thread Value: threadLocal.get());});thread.start();} }可以通过set(T)方法来设置一个值在当前线程下再通过get()方法获取到原先设置的值 2.2.2 ThreadLocal 原理 ThreadLocal原理主要涉及Java内存模型中的“线程封闭”概念和ThreadLocal类的设计。 每个线程都有自己的ThreadLocalMap 在Java中每个线程都维护着一个ThreadLocalMap对象其中存储了线程本地变量的键值对。这个ThreadLocalMap在Thread类中以ThreadLocal.ThreadLocalMap类型的成员变量存在。 ThreadLocal作为 ThreadLocalMap 键 当一个ThreadLocal对象被设置为线程的局部变量时它实际上是作为ThreadLocalMap的键而对应的值则是线程特定的变量。 支持多个ThreadLocal变量 每个线程可以同时持有多个ThreadLocal对象每个ThreadLocal对象对应一个特定的线程局部变量。 ThreadLocalMap的查找和存储机制 当线程需要获取ThreadLocal变量时会先访问自己的ThreadLocalMap根据ThreadLocal对象找到对应的值。如果没有找到会创建一个新的Entry并存储到ThreadLocalMap中。 通过这种设计ThreadLocal实现了线程封闭性和线程间变量隔离为多线程环境下共享变量带来了一种简洁、安全的解决方案。 2.2.3 ThreadLocal 的使用场景 ThreadLocal 是一个线程本地变量工具类它提供了线程级别的数据隔离每个线程都可以拥有自己独立的变量副本。ThreadLocal 的使用场景包括但不限于 保存线程相关的上下文信息在多线程环境中有些信息是针对每个线程独立存在的比如用户身份信息、数据库连接、请求参数等。ThreadLocal 可以用于保存这些线程相关的上下文信息避免在线程之间相互干扰。提升性能在某些情况下对于频繁访问的对象可以将其放入 ThreadLocal 中以减少方法参数传递和数据共享的开销从而提升性能。跟踪日志可以利用 ThreadLocal 在日志中添加线程标识符用于追踪不同线程产生的日志信息方便日志分析和调试。缓存数据在某些情况下需要对一些数据进行缓存而这些数据是与线程相关的可以使用 ThreadLocal 存储这些线程私有的缓存数据。Web开发中的用户会话管理在 Web 开发中可以使用 ThreadLocal 存储用户的会话信息确保每个用户的会话在不同请求之间得到正确管理。 如,在一个多线程的 Web 应用中需要持续跟踪用户的登录状态 public class UserContext {private static ThreadLocalUser userThreadLocal new ThreadLocal();public static void setUser(User user) {userThreadLocal.set(user);}public static User getUser() {return userThreadLocal.get();}public static void clear() {userThreadLocal.remove();} }// 在某个地方设置用户信息 User currentUser userService.getCurrentUser(); UserContext.setUser(currentUser);// 在其他地方获取用户信息 User loggedInUser UserContext.getUser();2.2.4 ThreadLocal 注意 ThreadLocalMap 中的 entry 继承了 WeakReference在内存不足的时候ThreadLocalMap 中的数据会被自动回收,所以在使用的时候要注意处理空值情况 static class Entry extends WeakReferenceThreadLocal? {/** The value associated with this ThreadLocal. */Object value;Entry(ThreadLocal? k, Object v) {super(k);value v;} }三、总结 本文详细介绍了join方法的使用方法、原理和适用场景强调了其在多线程编程中的重要性。同时ThreadLocal的工作原理和实际应用场景也得到了阐述特别是在数据隔离和性能优化方面的作用。
http://www.dnsts.com.cn/news/35984.html

相关文章:

  • 合肥网站设计goz怎么查企业
  • 微信公众号授权给网站重庆网站建设公司推荐
  • 个人如何学习做网站软件开发学校排名
  • 有什么做视频的免费素材网站好自助建站免费永久
  • 网站建设大赛策划书郴州新网交友
  • 网站开发进度表成都 网页设计
  • 云南建设投资集团网站首页装饰工程造价
  • 推广网站如何做互联网营销师报考条件
  • 带做网站价位719y你会回来感谢我的
  • 高中生自己做网站推广链接赚钱
  • 临海建设局官方网站山东泰安微平台
  • 云信网站建设网站索引量暴增
  • 如何做网站推广最有效做网站连接数据库怎么显示图片
  • 怎么给网站加友情链接wordpress 搭建个人网站
  • 常州中小企业网站制作工程公司财务制度及流程
  • 如何wordpress建站卢松松博客源码 wordpress博客模板
  • 郑州老牌做企业网站7个免费的ui素材网站
  • 南宁信息建设网站wordpress rossi 汉化
  • 南昌网站建设哪家强将已有wordpress项目部署在本地
  • 福清建设局网站河南建筑信息公共
  • 景洪服装网站建设现在网站开发用什么语言
  • 石林县工程建设个体交易网站做h5的图片网站
  • 深圳外包网站网站大屏轮播图效果怎么做
  • 宁夏网站建设联系电话辛集做网站公司
  • 网站建设好的wordpress 页面 父级
  • 苏州网站建设案例适应移动端网站模板
  • 苏州免费发布信息网站制作公众号流程
  • 代理网站下载软件开发公司有哪些
  • 网站前端代码模板东莞做网站排名优化推广
  • 外贸网站建设服务机构国家企业信用系统官网