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

东海县做网站广告网站开发官网

东海县做网站广告,网站开发官网,清廉桂林网站,织梦装修设计网站模板threadlocal介绍 我知道本地线程#xff0c;但直到最近才真正使用过它。 因此#xff0c;我开始深入研究该主题#xff0c;因为我需要一种传播某些用户信息的简便方法 通过Web应用程序的不同层#xff0c;而无需更改每个调用方法的签名。 小前提信息 线程是具有自己的调… threadlocal 介绍 我知道本地线程但直到最近才真正使用过它。 因此我开始深入研究该主题因为我需要一种传播某些用户信息的简便方法 通过Web应用程序的不同层而无需更改每个调用方法的签名。 小前提信息 线程是具有自己的调用栈的单个进程。在Java中每个调用栈有一个线程或者每个线程有一个调用栈。即使您没有在程序中创建任何新线程线程也可以在没有您的程序的情况下运行最好的例子是当您仅通过main方法启动一个简单的Java程序时您没有隐式调用new Thread。start但是JVM为您创建了一个主线程以运行main方法。 主线程是非常特殊的因为它是所有其他线程都会从中生成的线程 线程完成后应用程序结束了它的生命周期。 在Web应用程序服务器中通常会有一个线程池因为创建的线程类非常重。所有JEE服务器WeblogicGlassfishJBoss等都有一个自调整线程池这意味着线程池会增加或减少需要的时间因此不会在每个请求上创建线程而现有的线程将被重用。 了解线程局部 为了更好地理解线程本地我将展示一种自定义线程本地的非常简单的实现。 package ccs.progest.javacodesamples.threadlocal.ex1;import java.util.HashMap; import java.util.Map;public class CustomThreadLocal {private static Map threadMap new HashMap();public static void add(Object object) {threadMap.put(Thread.currentThread(), object);}public static void remove(Object object) {threadMap.remove(Thread.currentThread());}public static Object get() {return threadMap.get(Thread.currentThread());}} 因此您可以随时在应用程序中调用CustomThreadLocal上的add方法该方法将在当前映射中将当前线程作为键并将要与该线程关联的对象作为值。 该对象可能是您想要从当前执行的线程中的任何位置访问的对象或者它可能是您想要与该线程保持关联并重复使用多次的昂贵对象。 您定义一个ThreadContext类您在其中拥有要在线程内传播的所有信息。 package ccs.progest.javacodesamples.threadlocal.ex1;public class ThreadContext {private String userId;private Long transactionId;public String getUserId() {return userId;}public void setUserId(String userId) {this.userId userId;}public Long getTransactionId() {return transactionId;}public void setTransactionId(Long transactionId) {this.transactionId transactionId;}public String toString() {return userId: userId ,transactionId: transactionId;}} 现在是时候使用ThreadContext了。 我将启动两个线程并在每个线程中添加一个新的ThreadContext实例该实例将保存我想为每个线程传播的信息。 package ccs.progest.javacodesamples.threadlocal.ex1;public class ThreadLocalMainSampleEx1 {public static void main(String[] args) {new Thread(new Runnable() {public void run() {ThreadContext threadContext new ThreadContext();threadContext.setTransactionId(1l);threadContext.setUserId(User 1);CustomThreadLocal.add(threadContext);//here we call a method where the thread context is not passed as parameterPrintThreadContextValues.printThreadContextValues();}}).start();new Thread(new Runnable() {public void run() {ThreadContext threadContext new ThreadContext();threadContext.setTransactionId(2l);threadContext.setUserId(User 2);CustomThreadLocal.add(threadContext);//here we call a method where the thread context is not passed as parameterPrintThreadContextValues.printThreadContextValues();}}).start();} } 注意 CustomThreadLocal.addthreadContext是当前线程与ThreadContext实例相关联的代码行 正如您将看到执行此代码一样结果将是 userId:User 1,transactionId:1 userId:User 2,transactionId:2 这是怎么可能的因为我们没有将ThreadContextuserId或trasactionId作为参数传递给printThreadContextValues package ccs.progest.javacodesamples.threadlocal.ex1;public class PrintThreadContextValues {public static void printThreadContextValues(){System.out.println(CustomThreadLocal.get());} } 很简单 从CustomThreadLocal的内部映射调用CustomThreadLocal.get时将检索与当前线程关联的对象。 现在让我们看看何时使用真正的ThreadLocal类的示例。 上面的CustomThreadLocal类只是为了了解ThreadLocal类背后的原理该原理非常快并且以最佳方式使用内存 package ccs.progest.javacodesamples.threadlocal.ex2;public class ThreadContext {private String userId;private Long transactionId;private static ThreadLocal threadLocal new ThreadLocal(){Overrideprotected ThreadContext initialValue() {return new ThreadContext();}};public static ThreadContext get() {return threadLocal.get();}public String getUserId() {return userId;}public void setUserId(String userId) {this.userId userId;}public Long getTransactionId() {return transactionId;}public void setTransactionId(Long transactionId) {this.transactionId transactionId;}public String toString() {return userId: userId ,transactionId: transactionId;} } 如javadoc所述ThreadLocal实例通常是希望将状态与线程关联的类中的私有静态字段。 package ccs.progest.javacodesamples.threadlocal.ex2;public class ThreadLocalMainSampleEx2 {public static void main(String[] args) {new Thread(new Runnable() {public void run() {ThreadContext threadContext ThreadContext.get();threadContext.setTransactionId(1l);threadContext.setUserId(User 1);//here we call a method where the thread context is not passed as parameterPrintThreadContextValues.printThreadContextValues();}}).start();new Thread(new Runnable() {public void run() {ThreadContext threadContext ThreadContext.get();threadContext.setTransactionId(2l);threadContext.setUserId(User 2);//here we call a method where the thread context is not passed as parameterPrintThreadContextValues.printThreadContextValues();}}).start();} } 调用get时 新的ThreadContext实例与当前线程关联然后将所需值设置为ThreadContext实例。 如您所见结果与第一组样本相同。 userId:User 1,transactionId:1 userId:User 2,transactionId:2 这可能是相反的顺序因此如果先看到“用户2”请不要担心 package ccs.progest.javacodesamples.threadlocal.ex2;public class PrintThreadContextValues {public static void printThreadContextValues(){System.out.println(ThreadContext.get());} } ThreadLocal的另一个非常有用的用法是当您有一个非常昂贵的对象的非线程安全实例时的情况。我发现的大多数极性示例是使用SimpleDateFormat但很快我将提供另一个使用Webservices端口的示例 package ccs.progest.javacodesamples.threadlocal.ex4;import java.text.SimpleDateFormat; import java.util.Date;public class ThreadLocalDateFormat {// SimpleDateFormat is not thread-safe, so each thread will have oneprivate static final ThreadLocal formatter new ThreadLocal() {Overrideprotected SimpleDateFormat initialValue() {return new SimpleDateFormat(MM/dd/yyyy);}};public String formatIt(Date date) {return formatter.get().format(date);} } 结论 线程局部变量有很多用途这里仅描述两种:(我认为使用最多的 真正的每线程上下文例如用户ID或事务ID。 每线程实例以提高性能。 参考 Java代码样本博客中的JCG合作伙伴 Cristian Chiovari 了解了ThreadLocal的概念 。 翻译自: https://www.javacodegeeks.com/2012/07/understanding-concept-behind.htmlthreadlocal
http://www.sadfv.cn/news/208832/

相关文章:

  • 图书馆网站建设情况说明个人开店的电商平台
  • 保险公司官方网站智慧团建系统登录
  • 迁安做网站中的cms润强php做调查问卷网站
  • 基层政权和社区建设司网站wordpress转dedecms
  • 全球访问量最大的10个网站定制做网站费用
  • 国内开源平台商城网站 没有什么文章 怎样优化
  • 企业网站空间购买无极电影网在线观看完整版
  • 免费网站免费进入在线哈尔滨小程序建设
  • 做网签合同的网站是做效果图的外包网站
  • 公司网站点击量如何看正能量软件免费观看不用下载
  • iis做的网站手机怎么访问南通高端网站建设
  • 同一个空间可以做两个网站么网站建设注意的问题
  • 采集网站会收录吗wordpress4.5 缩略图函数
  • 基于php的电商网站开发个人网站建设的收获
  • 哈尔滨网站建设公司有哪些网站制作工资
  • 百度网站电话是多少郑州市男科医院哪比较好
  • 小说网站怎么做局网站建设管理整改情况
  • 邢台柏乡县建设局网站希爱力
  • 重庆巫山网站设计公司平台销售模式有哪些
  • 如何选择家居网站建设Wordpress 实名认证
  • 企业网站策划过程邯郸移动网站制作
  • 网站建设与管理的过程京东app下载官网免费下载
  • 宜城网站建设网络推广海南住房建设厅网站
  • 滨州淘宝网站建设宝安区住房和建设局网站
  • 网站可以做多少优化关键词WordPress怎么上传头像
  • 安平做网站做推广电话电子商务网页设计代码
  • 网页建设技术和网站策划书常州自助建站
  • 个人相册网站建设报告怎样建立网页
  • 南沙定制型网站建设长沙网页制作企业
  • 给网站做蜘蛛抓取淘宝网站可以做百度快照吗