最近上网看了一下回调模式,浏览了几篇文章,感觉还挺有意思,赶紧记录一下,免得以后忘记还要上网查。
public class Leader implements CallBack { public void askCoder() { new Coder().build(this); } @Override public void msgBack(String taskName) { System.out.println(taskName); } }
这个类代表公司高层
public class Coder { public void build(CallBack callBack) { System.out.println("project");//你写了一个项目 callBack.msgBack("salary");//然后管老板要工资 } }
这个类代表苦*码农
public class Boot { public static void main(String[] args) { Leader leader = new Leader(); leader.askCoder();//老板叫你写个项目 } }
这个主方法模拟你们的互动,这大概就是所谓的双向调用吧,至于回调接口就偷个懒直接用了CallBack,不晓得这个接口是不是给回调用的。
ThreadLocal这个东西上网看了一些文章,给我的感觉就是这东西就像一个“线程银行”,它能记住不同的线程的“账户”。
比如A线程存了100元,B线程存了200元,那么当A线程来取钱的时候,ThreadLocal不会把B线程账户里的钱给A线程。
下面我做了一个简单的测试,首先定义一个自定义线程:
import lombok.SneakyThrows; import lombok.extern.java.Log; @Log public class LocalThread implements Runnable { String msg; public LocalThread(String msg) { this.msg = msg; } @SneakyThrows @Override public void run() { Boot.threadLocal.set(msg); log.info(Thread.currentThread().getName() + Boot.threadLocal.get()); } }
然后,测试一下不同线程对ThreadLocal的存取:
import lombok.extern.java.Log;
@Log
public class Boot {
public static ThreadLocal threadLocal = new ThreadLocal();
public static void main(String[] args) throws InterruptedException {
threadLocal.set("时光雕琢他风骨");//主线程存入字符串
LocalThread l1 = new LocalThread("风霜冷冽他眉目");
Thread thread = new Thread(l1);
thread.start();
Thread.sleep(2000);
log.info(Thread.currentThread().getName() + Boot.threadLocal.get());//主线程获取字符串
}
}
结果可以发现,主线程和子线程对ThreadLocal的存取是互不影响的。