栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

高并发编程(ThreadLocal)上下文设计模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

高并发编程(ThreadLocal)上下文设计模式

ThreadLocal介绍:

ThreadLocal类顾名思义可以理解为线程本地变量。也就是说如果定义了一个ThreadLocal,每个线程往这个ThreadLocal中读写是线程隔离,互相之间不会影响的。它提供了一种将可变数据通过每个线程有自己的独立副本从而实现线程封闭的机制。

上下文设计模式简介:

上下文就是贯穿整个系统或者阶段生命周期的对象,其中存贮了一些系统的全局变量信息。在很多时候,单个线程的执行任务步骤非常多的时候,后面的某一步骤需要前面的输出值(责任链模式中特别多),那么需要将参数从头传递到尾,这样会特别的麻烦,并且在参数过多的情况下更加不合适,那么这个时候就需要一个上下文作为上下文进行绑定线程传递了的.java为我们提供了一个很好的容器,就是ThreadLocal的。

使用ThreadLocal实现上下文设计模式的实现:
  1. Context 文本类 用来存储上下文数据.
public class Context {
    private String name;

    public void setId(String id) {
        this.id = id;
    }

    private String id;

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  1. ActionContext :用来创建ThreadLocal对象(单例模式实现)以及获取Context对象
public class ActionContext {

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

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

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

    public Context getContext(){
        return threadLocal.get();
    }
}
  1. ExecutionTask: 执行任务
public class ExecutionTask implements Runnable{
    private QueryFromAction queryFromAction = new QueryFromAction();
    @Override
    public void run() {
        Context context = ActionContext.getInstance().getContext();
        queryFromAction.execute();
        System.out.println("The idt query success!");
        System.out.println("The name is" + context.getName() +"and The IdCard is" + context.getId());
    }
}
  1. QueryFromAction: 模式从数据库存放数据
public class QueryFromAction {
    public void execute(){
        try {
             Thread.sleep(1000);
             String name = "author" + Thread.currentThread().getName();
             ActionContext.getInstance().getContext().setName(name);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
  1. QueryFromHttpAction模式从其他地方拿数据
public class QueryFromHttpAction {
    public void execute(){
        Context context = ActionContext.getInstance().getContext();
        String name = context.getName();
        String id = getCardId(name);
        context.setId(id);
    }

    public String getCardId(String name){
        try {
            Thread.sleep(1000);

        }catch (Exception e){
            e.printStackTrace();
        }
        return "号码:1231242155534123>>>>>" + Thread.currentThread().getId();
    }
}
  1. 测试
public class ContextTest {
    public static void main(String[] args) {
        for(int i = 0; i < 5; i++){
            new Thread(new ExecutionTask()).start();
        }
    }
}

结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/425359.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号