首页 > 线程上下文设计模式

线程上下文设计模式

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;public class Test {public static void main(String[] args){ThreadLocalExample.test();}
}/*21.2 线程上下文设计*/class ApplicationConfiguration {}
class RuntimeInfo {}
class ActionContext {}final class ApplicationContext{private ApplicationConfiguration configuration;private RuntimeInfo runtimeInfo;//。。。private static class Holder{private static ApplicationContext instance = new ApplicationContext();}public static ApplicationContext getContext() {return Holder.instance;}public ApplicationConfiguration getConfiguration() {return configuration;}public void setConfiguration(ApplicationConfiguration configuration) {this.configuration = configuration;}public RuntimeInfo getRuntimeInfo() {return runtimeInfo;}public void setRuntimeInfo(RuntimeInfo runtimeInfo) {this.runtimeInfo = runtimeInfo;}/*需求:单个线程执行的步骤会非常多,后一个步骤的输入可能是前一个步骤的输出,比如单个线程多步骤执行时,为了使得功能单一,有时候我们会采用职责链设计模式。虽然有时候后一个步骤未必需要前一个步骤的输出结果,但是都需要将context从头到尾进行传递,假如方法参数比较少还可以容忍,如果方法参数比较多,在七八次的调用甚至十几次的调用,都需要从头到尾地传递context,很显然这是一种比较繁琐的设计,我们可以采用上下文设计来解决这样的问题。*/private ConcurrentHashMap contexts =new ConcurrentHashMap<>();public ActionContext getContexts() {ActionContext actionContext = contexts.get(Thread.currentThread());if(actionContext==null){actionContext=new ActionContext();contexts.put(Thread.currentThread(),actionContext);}return actionContext;}
}/*21.3.2 ThreadLocal的方法详解及源码分析*/
class ThreadLocalExample{public static void test() {ThreadLocal l = new ThreadLocal<>();IntStream.range(0, 10).forEach(i->new Thread(()->{try{l.set(i);System.out.println(Thread.currentThread()+ " set i "+l.get());TimeUnit.SECONDS.sleep(1);System.out.println(Thread.currentThread()+ " set i "+l.get());} catch (InterruptedException e) {e.printStackTrace();}}).start());try {TimeUnit.SECONDS.sleep(3);System.out.println(l.get());} catch (InterruptedException e) {e.printStackTrace();}}
}

 

《Java高并发编程详解》笔记

转载于:https://www.cnblogs.com/junjie2019/p/10607204.html

更多相关:

  • 在.Net Framework中,配置文件一般采用的是XML格式的,.NET Framework提供了专门的ConfigurationManager来读取配置文件的内容,.net core中推荐使用json格式的配置文件,那么在.net core中该如何读取json文件呢?1、在Startup类中读取json配置文件1、使用Confi...

  •   1 public class FrameSubject extends JFrame {   2    3   …………..   4    5   //因为无法使用多重继承,这儿就只能使用对象组合的方式来引入一个   6    7   //java.util.Observerable对象了。   8    9   DateSub...

  • 本案例主要说明如何使用NSwag 工具使用桌面工具快速生成c# 客户端代码、快速的访问Web Api。 NSwagStudio 下载地址 比较强大、可以生成TypeScript、WebApi Controller、CSharp Client  1、运行WebApi项目  URL http://yourserver/swagger 然后...

  •   在绑定完Action的所有参数后,WebAPI并不会马上执行该方法,而要对参数进行验证,以保证输入的合法性.   ModelState 在ApiController中一个ModelState属性用来获取参数验证结果.   public abstract class ApiController : IHttpController,...

  • 1# 引用  C:AVEVAMarineOH12.1.SP4Aveva.ApplicationFramework.dll C:AVEVAMarineOH12.1.SP4Aveva.ApplicationFramework.Presentation.dll 2# 引用命名空间, using Aveva.Applicati...

  • 在C++有两种字符串流,一种在sstream中定义, 另一种在strstream中定义。 它们实现的东西基本一样。 strstream里包含 class strstreambuf; class istrstream; class ostrstream; class strstream; 它们是基于C类型字符串char*编写的...

  • 此文章完成度【100%】留着以后忘记的回顾。多写多练多思考,我会努力写出有意思的demo,如果知识点有错误、误导,欢迎大家在评论处写下你的感想或者纠错。     ORM介绍:对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程...

  • Bootstrap框架和inconfont、font-awesome使用 iconfont的使用:https://www.cnblogs.com/clschao/articles/10387580.html Bootstrap介绍   Bootstrap是Twitter开源的基于HTML、CSS、JavaScript的前端框架。  ...

  • Log4j->SLF4j->Logback是同一个人开发的 import lombok.extern.slf4j.Slf4j; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.Spr...

  • HTML页面代码块: 1 2 3 4 5 6

    执行计划和执行顺序

    今天从http://www.oraclefans.cn/forum/showtopic.jsp?rootid=181&CPages=1看到一个关于执行计划的东东,做个笔记,记录下来,我也是从上面载来的。 如果要了解执行计划和执行顺序,必须理解执行计划的父子关系。执行计划是一个树状结构,顶层的STATEMENT是这棵树的根。父子关系按...