美文网首页
context上下文模式

context上下文模式

作者: jiahzhon | 来源:发表于2020-10-07 12:37 被阅读0次
  • 有时候会一条线程会分步骤进行,第二个步骤依赖于第一个步骤运行的结果。在多线程的情况下很容易出现线程安全的问题。这其中需要一个线程安全的中间上下问来帮助。
  • 优化:借助ThreadLocal(有点像一个以线程为key值的map)来构建上下文。他相当于是每一个线程的自己的保险箱。
  • Context 上下文具体类
public class Context {

    private String name;
    private String cardId;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public String getCardId() {
        return cardId;
    }
}
  • ActionContext(关键,借助ThreadLocal,把Context放入,自己是单例的)
public final class ActionContext {

    private static final ThreadLocal<Context> threadLocal = new ThreadLocal<Context>() {
        @Override
        protected Context initialValue() {
            return new Context();
        }
    };

    private static class ContextHolder {
        private final static ActionContext actionContext = new ActionContext();
    }

    public static ActionContext getActionContext() {
        return ContextHolder.actionContext;
    }

    public Context getContext() {
        return threadLocal.get();
    }

    private ActionContext(){

    }
}
  • 模拟第一个步骤,从数据库获取数据,此时与context发生了交互
public class QueryFromDBAction {

    public void execute() {
        try {
            Thread.sleep(1000L);
            String name = "Alex " + Thread.currentThread().getName();
            ActionContext.getActionContext().getContext().setName(name);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
  • 第二个步骤依赖于第一个步骤,模拟从http获取数据
public class QueryFromHttpAction {

    public void execute() {
        Context context = ActionContext.getActionContext().getContext();
        String name = context.getName();
        String cardId = getCardId(name);
        context.setCardId(cardId);
    }

    private String getCardId(String name) {
        try {
            Thread.sleep(1000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return "435467523543" + Thread.currentThread().getId();
    }
}
  • 线程真正运行的Runnable(有了上下文,即使是在执行后再创建上下文对象,无需交互,也能获取想要的数值)
public class ExecutionTask implements Runnable {

    private QueryFromDBAction queryAction = new QueryFromDBAction();

    private QueryFromHttpAction httpAction = new QueryFromHttpAction();

    @Override
    public void run() {

        queryAction.execute();
        System.out.println("The name query successful");
        httpAction.execute();
        System.out.println("The card id query successful");

        Context context = ActionContext.getActionContext().getContext();
        System.out.println("The Name is " + context.getName() + " and CardId " + context.getCardId());
    }
}
  • 运行类,创建线程
public class ContextTest {
    public static void main(String[] args) {
        IntStream.range(1, 5)
                .forEach(i ->
                        new Thread(new ExecutionTask()).start()
                );
    }
}

相关文章

  • Context

    Context 表示上下文。Android中的 Context 使用了装饰模式。 image.png Androi...

  • 2018-08-08

    React 高级指南 React 新版上下文(context) context ?答:上下文(Context) 提...

  • 理解Context

    什么是Context Context: 字面理解为上下文,语境。Android应用模型是基于组件的应用设计模式,组...

  • context上下文模式

    有时候会一条线程会分步骤进行,第二个步骤依赖于第一个步骤运行的结果。在多线程的情况下很容易出现线程安全的问题。这其...

  • Linux中的Context与同步

    Linux中的Context (上下文) 基于ARM64 Context 上下文: 上下文的概念:https://...

  • 领域驱动3 限界上下文

    一.理解限界上下文 1.限界上下文的定义 限界上下文:Bounded Context1)上下文(Context)表...

  • Context Hook

    Context Hook 用于获取上下文数据 使用context: 使用Context Hook:

  • Spring核心——MessageSource实现国际化

    Spring的国际化 在上下文与IoC对ApplicationContext以及Context相关的设计模式进行了...

  • 1. OpenGL图形专有名词、坐标解析

    一、名词解析: 1. Context(上下文): 调用OpenGL之前需要创建一个context上下文,conte...

  • 对 Context 的理解

    对 Context 的理解 1. Context的作用: Context 是应用组件的上下文,有了 Context...

网友评论

      本文标题:context上下文模式

      本文链接:https://www.haomeiwen.com/subject/bzitpktx.html