回调和反应式编程都可以实现系统吞吐量有效提升,但是这两种编程模式存在阅读、编写、调试困难的问题,所以实际项目中还是以线程池为主。但是 java 的线程是平台线程,可以理解为并行线程数最多等于 CPU 核数 (macOS 查看核数sysctl hw.physicalcpu hw.logicalcpu),并且存在线程内存占用大,上下文切换耗时高问题,所以在高并发请求中表现不如前面两种模式(spring … java thread pool class hierarchy Executor (java.util.concurrent) |---ExecutorService (java.util.concurrent) |---AbstractExecutorService (java.util.concurrent) | |---ForkJoinPool (java.util.concurrent) … 线程:任务执行的环境,可以理解为传送带。注意任务必须在线程上面被执行。
[…] 任务:Runnable/Callable 的实现,可以理解为传送带上面的工序。
[…] 资源:线程在处理任务具体工序时需要使用的对象,例如信号量,锁,并发集合。需要注意,任务本身描述也是一个对象(即 Runnable/Callable 子类实例),所以在 Runnable … 这三个方法是在 class Object 上面的,也就是所有对象都有这个方法。这里对象就是上一篇中类比的资源,可以当成一个信号量。
Object.wait() to suspend a thread(等价于sem.wait())。将当前线程暂停并释放当前对象锁,直到其他线程调用了当前对象的 notify/notifyAll 方法。
Object.notify() to wake a thread … 在通常的业务开发中,ThreadLocal 有两种典型的使用场景。
[…] 场景 1,ThreadLocal 用作保存每个线程独享的对象,为每个线程都创建一个副本,这样每个线程都可以修改自己所拥有的副本,而不会影响其他线程的副本,确保了线程安全。
[…] 场景 2,ThreadLocal 用作每个线程内需要独立保存信息,以便供其他方法更方便地获取该信息的场景。每个线程获 …