Java之回调模式和ThreadLocal

最近上网看了一下回调模式,浏览了几篇文章,感觉还挺有意思,赶紧记录一下,免得以后忘记还要上网查。

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的存取是互不影响的。

posted @ 2020-10-22 16:26  无心大魔王  阅读(163)  评论(0编辑  收藏  举报