//设计为单例
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()
);
}
}