Java线程池练习题

发布时间:2026/6/26 5:09:45

Java线程池练习题 1创建核心线程数为5的固定线程池packagecom.example.exerciseThreadPool;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.TimeUnit;publicclassFixedThreadPoolDemo{publicstaticvoidmain(String[]args){//1.创建核心线程数为5的固定线程池ExecutorServiceexecutorExecutors.newFixedThreadPool(5);//2.提交10个任务for(inti1;i10;i){finalinttaskIdi;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自定义线程池行为验证深入理解corePoolSizemaximumPoolSizeworkQueue和拒绝策略的关系packagecom.example.exerciseThreadPool;importjava.util.concurrent.*;publicclassThreadPoolParamsDemo{//自定义线程池行为验证深入理解corePoolSizemaximumPoolSizeworkQueue和拒绝策略的关系publicstaticvoidmain(String[]args){//配置参数intcorePoolSize2;intmaximumPoolSize4;longkeepAliveTime60;TimeUnitunitTimeUnit.SECONDS;//容量为2的有界队列BlockingQueueRunnableworkQueuenewArrayBlockingQueue(2);ThreadFactorythreadFactoryExecutors.defaultThreadFactory();//默认拒绝策略抛出异常RejectedExecutionHandlerhandlernewThreadPoolExecutor.AbortPolicy();ThreadPoolExecutorexecutornewThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory,handler);System.out.println(---开始提交任务---);for(inti1;i8;i){finalinttaskIdi;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{ThreadPoolExecutorexecutornewThreadPoolExecutor(2,4,60,TimeUnit.SECONDS,newArrayBlockingQueue(2));//提交一些事务for(inti0;i6;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{//多线程抢红包线程安全结合线程池与锁机制解决资源竞争privatestaticBigDecimaltotalAmountnewBigDecimal(10.00);privatestaticfinalReentrantLocklocknewReentrantLock();privatestaticintremainingPeople10;publicstaticvoidmain(String[]args){ExecutorServiceexecutorExecutors.newFixedThreadPool(10);for(inti1;i10;i){finalintpersonIdi;executor.submit(()-{lock.lock();try{if(remainingPeople0){BigDecimalamount;if(remainingPeople1){// 最后一个人拿走剩余所有amounttotalAmount;}else{//随机金额逻辑简化每人至少0.01最多剩余金额的均值*2BigDecimalmaxtotalAmount.divide(newBigDecimal(remainingPeople),2,BigDecimal.ROUND_HALF_UP).multiply(newBigDecimal(2));//简单模拟取剩余金额的10%-20%作为随机范围此处简化为固定比例演示doublerandomRatioMath.random()*0.10.05;amounttotalAmount.multiply(newBigDecimal(randomRatio)).setScale(2,BigDecimal.ROUND_HALF_DOWN);//确保不超过剩余金额且不低于0.01if(amount.compareTo(totalAmount)0){amounttotalAmount;}if(amount.compareTo(newBigDecimal(0.01))0){amountnewBigDecimal(0.01);}}totalAmounttotalAmount.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进行全局捕获。

相关新闻