Java线程池练习题
2026/6/26 5:09:29 网站建设 项目流程

1:创建核心线程数为5的固定线程池

packagecom.example.exerciseThreadPool;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.TimeUnit;publicclassFixedThreadPoolDemo{publicstaticvoidmain(String[]args){//1.创建核心线程数为5的固定线程池ExecutorServiceexecutor=Executors.newFixedThreadPool(5);//2.提交10个任务for(inti=1;i<=10;i++){finalinttaskId=i;executor.submit(()->{System.out.println("任务"+taskId+"开始执行,线程:"+Thread.currentThread().getName());try{//模拟耗时操作TimeUnit.SECONDS.sleep(1);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}System.out.println("任务"+taskId+"执行完毕");});}//3.关闭线程池executor.shutdown();try{if(!executor.awaitTermination(60,TimeUnit.SECONDS)){executor.shutdownNow();}}catch(InterruptedExceptione){executor.shutdownNow();}}}

2:自定义线程池行为验证,深入理解corePoolSize,maximumPoolSize,workQueue和拒绝策略的关系

packagecom.example.exerciseThreadPool;importjava.util.concurrent.*;publicclassThreadPoolParamsDemo{//自定义线程池行为验证,深入理解corePoolSize,maximumPoolSize,workQueue和拒绝策略的关系publicstaticvoidmain(String[]args){//配置参数intcorePoolSize=2;intmaximumPoolSize=4;longkeepAliveTime=60;TimeUnitunit=TimeUnit.SECONDS;//容量为2的有界队列BlockingQueue<Runnable>workQueue=newArrayBlockingQueue<>(2);ThreadFactorythreadFactory=Executors.defaultThreadFactory();//默认拒绝策略:抛出异常RejectedExecutionHandlerhandler=newThreadPoolExecutor.AbortPolicy();ThreadPoolExecutorexecutor=newThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory,handler);System.out.println("---开始提交任务---");for(inti=1;i<=8;i++){finalinttaskId=i;try{executor.execute(()->{System.out.println("任务"+taskId+"正在运行,线程"+Thread.currentThread().getName());try{TimeUnit.SECONDS.sleep(2);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}});System.out.println("任务"+taskId+"已提交");}catch(RejectedExecutionExceptione){System.out.println("任务"+taskId+"被拒绝"+e.getMessage());}}executor.shutdown();}}

3:监控线程池状态,获取运行时数据

packagecom.example.exerciseThreadPool;importjava.util.concurrent.ArrayBlockingQueue;importjava.util.concurrent.ThreadPoolExecutor;importjava.util.concurrent.TimeUnit;publicclassThreadPoolMonitorDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{ThreadPoolExecutorexecutor=newThreadPoolExecutor(2,4,60,TimeUnit.SECONDS,newArrayBlockingQueue<>(2));//提交一些事务for(inti=0;i<6;i++){executor.submit(()->{try{TimeUnit.SECONDS.sleep(3);}catch(InterruptedExceptione){}});}//短暂等待后打印状态TimeUnit.MILLISECONDS.sleep(500);System.out.println("活跃线程数"+executor.getActiveCount());System.out.println("当前线程池大小"+executor.getPoolSize());System.out.println("队列等待任务数"+executor.getQueue().size());System.out.println("已完成任务数"+executor.getCompletedTaskCount());executor.shutdownNow();}}

4:多线程抢红包(线程安全),结合线程池与锁机制解决资源竞争

packagecom.example.exerciseThreadPool;importjava.math.BigDecimal;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.locks.ReentrantLock;publicclassRedPacketDemo{//多线程抢红包(线程安全),结合线程池与锁机制解决资源竞争privatestaticBigDecimaltotalAmount=newBigDecimal("10.00");privatestaticfinalReentrantLocklock=newReentrantLock();privatestaticintremainingPeople=10;publicstaticvoidmain(String[]args){ExecutorServiceexecutor=Executors.newFixedThreadPool(10);for(inti=1;i<=10;i++){finalintpersonId=i;executor.submit(()->{lock.lock();try{if(remainingPeople>0){BigDecimalamount;if(remainingPeople==1){// 最后一个人拿走剩余所有amount=totalAmount;}else{//随机金额逻辑简化:每人至少0.01,最多剩余金额的均值*2BigDecimalmax=totalAmount.divide(newBigDecimal(remainingPeople),2,BigDecimal.ROUND_HALF_UP).multiply(newBigDecimal("2"));//简单模拟:取剩余金额的10%-20%作为随机范围,此处简化为固定比例演示doublerandomRatio=Math.random()*0.1+0.05;amount=totalAmount.multiply(newBigDecimal(randomRatio)).setScale(2,BigDecimal.ROUND_HALF_DOWN);//确保不超过剩余金额且不低于0.01if(amount.compareTo(totalAmount)>0){amount=totalAmount;}if(amount.compareTo(newBigDecimal("0.01"))<0){amount=newBigDecimal("0.01");}}totalAmount=totalAmount.subtract(amount);remainingPeople--;System.out.println("用户"+personId+"抢到"+amount+",剩余"+totalAmount);}}finally{lock.unlock();}});}executor.shutdown();}}

注意事项:
1:关闭线程池:务必在程序结束前调用shutdown()或shutdownNow(),否则JVM可能无法退出。
2:避免OOM:生产环境使用ThreadPoolExecutor构造函数并指定有界队列。
3:异常处理:在线程池任务中抛出的未捕获异常不会传播到主线程,建议在任务内部进行try-catch处理,或通过Thread.UncaughtExceptionHandler进行全局捕获。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询