ThreadLocal入门
模仿PageHelper案例
public class PageHelper {
// 使用ThreadLocal实现
private static ThreadLocal<Page> threadlocal = new ThreadLocal<>();
public static Page get(){
Page page = threadlocal.get();
return page;
}
public static void set(Page page){
threadlocal.set(page);
}
public static void startPage(Integer pageNum, Integer pageSize) {
set(new Page(pageSize, pageNum));
}
}
class Page{
int pageSize;
int pageNum;
public Page() {
}
public Page(int pageSize, int pageNum) {
this.pageSize = pageSize;
this.pageNum = pageNum;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
}
public static void main(String[] args) {
for (int i = 1; i <=10 ; i++) {
int i1 = i;
new Thread(new Runnable() {
@Override
public void run() {
// 如下两行代码没有任何 逻辑 引用关系
PageHelper.startPage(i1,10);
sqlBefore("select * from user");
// 分页参数是如何传递到sql执行的前置拦截器的呢?
}
}).start();
}
}
// sql 执行 前者拦截器
public static void sqlBefore(String sql) {
// ? 如何实现 pageNum 跟 pageSize的拼接
int pageNum = 0,pageSize = 0;
Page page = PageHelper.get();
pageNum = page.getPageNum();
pageSize = page.getPageSize();
sql = sql + " Limit "+((pageNum-1)*pageSize)+", " + pageSize;
System.out.println(sql+Thread.currentThread().getName());
}
结果

原理分析(总结)
万物接对象,当前线程也是对象,可以通过ThreadLocal 往 当前线程对象的成员属性中存数据。方便在线程的生命周期内随时取用。
源码分析





源码是最好的答案!
网友评论