Java多线程-线程池ExecutorService.shutdown什么时候执行
但是我用了计数信号量Semaphore后,发现线程还没有跑完,他就执行了shutdown().
各位大虾帮忙解答一下

public class SemaphoreTest extends Thread {
Semaphore position;
private int id;
public SemaphoreTest(int i, Semaphore s) {
this.id = i;
this.position = s;
}
public void run() {
try {
if (position.availablePermits() > 0) {
System.out.println("顾客[" + id + "]进入厕所,有空位");
} else {
System.out.println("顾客[" + id + "]进入厕所,没空位,排队");
}
position.acquire();
System.out.println("【" + id + "】acquire坑位");
Thread.sleep((int) (Math.random() * 1000));
System.out.println("【" + id + "】完毕release");
position.release();
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
ExecutorService pool = Executors.newCachedThreadPool();
Semaphore position = new Semaphore(2); // 初始化两个空位
for (int i = 0; i < 5; i++) {
pool.submit(new SemaphoreTest(i, position));
}
System.out.println("开始释放线程池资源");
pool.shutdown();
System.out.println("完成释放线程池资源");
position.acquireUninterruptibly(2);
System.out.println("如厕完毕,清理厕所");
position.release(2);
}
}
相关推荐
Java判断线程池线程是否执行完毕
主要介绍了Java判断线程池线程是否执行完毕,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java并发编程的艺术(七)——Executors
Executors框架简介Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逸出。Ex
Java并发编程成员方法实战:从Thread到线程池、锁与原子类全详解
多线程编程是Java开发的核心技能,无论是线程生命周期管理、任务异步执行,还是资源竞争控制,都离不开对常用成员方法的准确理解。线程池作为高并发场景下的基础组件,其execute()与submit()的选择、shutdown()的优雅关闭,直接影响系统的稳定性。锁机制(如ReentrantLock)与并发工具类(CountDownLatch、Semaphore)则提供了灵活的线程协作与限流手段。从Thread的start/interrupt到Future获取异步结果,每一类成员方法都对应着典型的工程场景与隐藏
Java CompletableFuture与线程池实战:构建高效并行订单处理系统
并发与并行是提升现代应用性能的核心技术概念。并发指多个任务在单核上交替执行,宏观上同时推进;并行则是多核CPU上真正的同时执行,能显著提升吞吐量。其技术价值在于充分利用多核资源,解决计算密集型任务和IO密集型任务的性能瓶颈,广泛应用于高并发服务器、数据处理和微服务等场景。通过Java的CompletableFuture和自定义线程池,开发者可以构建如订单处理系统般高效、清晰的并行任务流,实现类似“平行线”的独立执行与结果组合,有效管理资源竞争与异常处理。
ExecutorService.shutdown()应该是在线程执行完毕后,才会去关闭
NULL 博文链接:https://songjianyong.iteye.com/blog/2056990



