线程池
/** * 【强制】创建线程、线程池时需要指定有意义的线程名称[eg. 机房号],方便出错回溯 ??TODO 怎么回溯 * 【示例】自定义线程工厂, 并根据外部特征进行分组。比如:机房号、IP地址等 * * @author qiaoba.ty */ public class UserThreadFactory implements ThreadFactory { private final String namePrefix; private final AtomicInteger nextId = new AtomicInteger(1); /** * 可以通过工具类获取,eg. ZoneClientUtils * * @param whatFeatureOfGroup 分组的特征 */ public UserThreadFactory(String whatFeatureOfGroup) { this.namePrefix = "From UserThreadFactory‘s" + whatFeatureOfGroup + "-Worker-"; } @Override public Thread newThread(Runnable task) { String name = namePrefix + nextId.getAndIncrement(); return new Thread(null, task, name, 0); } public static void main(String[] args) { // 【强制】线程资源必须通过线程池提供,不允许在应用自行创建线程 // 【强制】创建线程池通过ThreadPoolExecutor,不允许使用Executors,因为Executors参数设置有点问题 ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 5, 5L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(2), new UserThreadFactory("local") //new BizThreadFactory(AmapClientUtil.getHost) ); /** * 线程池执行流程: * step1. 如果线程池大小 < corePoolSize, 创建新线程执行任务 * step2. 任务进入workQueue中等待, 等待释放后的线程执行 * step3. 任务加入workQueue失败,若线程池大小 < maxPoolSize, 创建新线程执行任务。若已达到maxPoolSize则拒绝任务 */ pool.submit(new Runnable() { @Override public void run() { System.out.println("hah"); } }); } }
ThreadLocal
public class TestContextHolder { /** * ThreadLocal用static修饰,避免重复创建变量。 为该类的每个实例,都创建新变量 */ public static ThreadLocal<String> test = new ThreadLocal<>(); public static void main(String[] args) { try { boolean bool = test.get() == null; } catch (Exception e) { } finally { // 【强制】必须回收自定义的ThreadLocal变量,因为线程可能会重复使用。可能导致数据串了的问题 test.remove(); } } }
锁
Redis实现的分布式锁怎么可重入?
原文:https://www.cnblogs.com/dameiwujaing/p/14581492.html