首页 > 编程语言 > 详细

线程上下文

时间:2019-11-01 22:06:51      阅读:81      评论:0      收藏:0      [点我收藏+]
//设计为单例
public final class ActionContext {

    // 构造方法私有化
    private ActionContext() {

    }

    // Holder类
    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 final ThreadLocal<Context> threadLocal = new ThreadLocal<Context>() {
        @Override
        protected Context initialValue() {
            return new Context();
        }
    };

}


public class Context {

    private String name;
    private String cardId;

    public String getCardId() {
        return cardId;
    }

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

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

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


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 cardId query successful");

        Context context = ActionContext.getActionContext().getContext();
        System.out.println("The Name is " + context.getName() + " and CardId  is " + context.getCardId());
    }
}

public class QueryFromDBAction {

    public void execute() {

        try {
            Thread.sleep(1000L);
            String name = Thread.currentThread().getName() +"中的Jack";
            ActionContext.getActionContext().getContext().setName(name);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

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 Thread.currentThread().getName()+"中的cardId";
    }
}

public class ContextTest {

    public static void main(String[] args) {

        IntStream.rangeClosed(1, 4)
                .forEach(i ->
                        new Thread(new ExecutionTask(),"【线程"+i+"").start()
                );
    }
}

 

线程上下文

原文:https://www.cnblogs.com/moris5013/p/11779477.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!