2026/4/18 5:04:45
网站建设
项目流程
网站建设备案书模板,国内新闻,站酷设计网,国际新闻今天最新一、线程池任务终止
shutdown()#xff1a;等当前任务完成#xff0c;然后停止
ScheduledExecutorService scheduler Executors.newScheduledThreadPool(1);// 启动任务#xff0c;初始延迟 0 秒#xff0c;每次执行完后延迟 1 秒再执行下一次
ScheduledFuture?等当前任务完成然后停止ScheduledExecutorServiceschedulerExecutors.newScheduledThreadPool(1);// 启动任务初始延迟 0 秒每次执行完后延迟 1 秒再执行下一次ScheduledFuture?futurescheduler.scheduleWithFixedDelay(()-{try{System.out.println(任务开始执行);Thread.sleep(5*1000);System.out.println(任务执行完成);}catch(InterruptedExceptione){System.out.println(任务被中断);}},0,1,TimeUnit.SECONDS);try{Thread.sleep(2*1000);}catch(InterruptedExceptione){e.printStackTrace();}scheduler.shutdown();# 输出结果 任务开始执行 任务执行完成cancel(true) shutdown()立即中断当前任务然后停止ScheduledExecutorServiceschedulerExecutors.newScheduledThreadPool(1);// 启动任务初始延迟 0 秒每次执行完后延迟 1 秒再执行下一次ScheduledFuture?futurescheduler.scheduleWithFixedDelay(()-{try{System.out.println(任务开始执行);Thread.sleep(5*1000);System.out.println(任务执行完成);}catch(InterruptedExceptione){System.out.println(任务被中断);}},0,1,TimeUnit.SECONDS);try{Thread.sleep(2*1000);}catch(InterruptedExceptione){e.printStackTrace();}future.cancel(true);scheduler.shutdown();# 输出结果 任务开始执行 任务被中断shutdownNow()立即中断所有任务然后停止ScheduledExecutorServiceschedulerExecutors.newScheduledThreadPool(1);// 启动任务初始延迟 0 秒每次执行完后延迟 1 秒再执行下一次ScheduledFuture?futurescheduler.scheduleWithFixedDelay(()-{try{System.out.println(任务开始执行);Thread.sleep(5*1000);System.out.println(任务执行完成);}catch(InterruptedExceptione){System.out.println(任务被中断);}},0,1,TimeUnit.SECONDS);try{Thread.sleep(2*1000);}catch(InterruptedExceptione){e.printStackTrace();}scheduler.shutdownNow();# 输出结果 任务开始执行 任务被中断二、中断的本质Java 中的中断机制是协作式的而不是强制性的上述案例中的中断是通过触发Thread.sleep()的 InterruptedException 来实现的中断只是设置标志位并不能强制打断任务如下例ScheduledExecutorServiceschedulerExecutors.newScheduledThreadPool(1);// 启动任务初始延迟 0 秒每次执行完后延迟 1 秒再执行下一次ScheduledFuture?futurescheduler.scheduleWithFixedDelay(()-{try{System.out.println(任务开始执行);ServerSocketserverSocketnewServerSocket(9999);serverSocket.accept();System.out.println(任务执行完成);}catch(IOExceptione){e.printStackTrace();}},0,1,TimeUnit.SECONDS);try{Thread.sleep(2*1000);}catch(InterruptedExceptione){e.printStackTrace();}future.cancel(true);scheduler.shutdown();Thread.sleep()在抛出 InterruptedException 时会自动清除中断标志位ScheduledExecutorServiceschedulerExecutors.newScheduledThreadPool(1);// 启动任务初始延迟 0 秒每次执行完后延迟 1 秒再执行下一次ScheduledFuture?futurescheduler.scheduleWithFixedDelay(()-{try{System.out.println(任务开始执行);System.out.println(中断标志位Thread.currentThread().isInterrupted());Thread.sleep(5*1000);System.out.println(任务执行完成);}catch(InterruptedExceptione){System.out.println(任务被中断);}finally{System.out.println(中断标志位Thread.currentThread().isInterrupted());}},0,1,TimeUnit.SECONDS);try{Thread.sleep(2*1000);}catch(InterruptedExceptione){e.printStackTrace();}future.cancel(true);scheduler.shutdown();# 输出结果 任务开始执行 中断标志位false 任务被中断 中断标志位false三、检查中断shutdown()等当前任务完成然后停止中断标志位没有变化ScheduledExecutorServiceschedulerExecutors.newScheduledThreadPool(1);// 启动任务初始延迟 0 秒每次执行完后延迟 1 秒再执行下一次ScheduledFuture?futurescheduler.scheduleWithFixedDelay(()-{System.out.println(任务开始执行);System.out.println(中断标志位Thread.currentThread().isInterrupted());ScannerscannernewScanner(System.in);System.out.print(请输入一个整数);intnumscanner.nextInt();System.out.println(任务执行完成);System.out.println(中断标志位Thread.currentThread().isInterrupted());},0,1,TimeUnit.SECONDS);try{Thread.sleep(2*1000);}catch(InterruptedExceptione){e.printStackTrace();}scheduler.shutdown();# 输出结果 任务开始执行 中断标志位false 请输入一个整数12 任务执行完成 中断标志位falsecancel(true) shutdown()立即中断当前任务中断标志位会被设置为 true然后停止ScheduledExecutorServiceschedulerExecutors.newScheduledThreadPool(1);// 启动任务初始延迟 0 秒每次执行完后延迟 1 秒再执行下一次ScheduledFuture?futurescheduler.scheduleWithFixedDelay(()-{System.out.println(任务开始执行);System.out.println(中断标志位Thread.currentThread().isInterrupted());ScannerscannernewScanner(System.in);System.out.print(请输入一个整数);intnumscanner.nextInt();System.out.println(任务执行完成);System.out.println(中断标志位Thread.currentThread().isInterrupted());},0,1,TimeUnit.SECONDS);try{Thread.sleep(2*1000);}catch(InterruptedExceptione){e.printStackTrace();}future.cancel(true);scheduler.shutdown();# 输出结果 任务开始执行 中断标志位false 请输入一个整数12 任务执行完成 中断标志位trueshutdownNow()立即中断所有任务中断标志位会被设置为 true然后停止ScheduledExecutorServiceschedulerExecutors.newScheduledThreadPool(1);// 启动任务初始延迟 0 秒每次执行完后延迟 1 秒再执行下一次ScheduledFuture?futurescheduler.scheduleWithFixedDelay(()-{System.out.println(任务开始执行);System.out.println(中断标志位Thread.currentThread().isInterrupted());ScannerscannernewScanner(System.in);System.out.print(请输入一个整数);intnumscanner.nextInt();System.out.println(任务执行完成);System.out.println(中断标志位Thread.currentThread().isInterrupted());},0,1,TimeUnit.SECONDS);try{Thread.sleep(2*1000);}catch(InterruptedExceptione){e.printStackTrace();}scheduler.shutdownNow();# 输出结果 任务开始执行 中断标志位false 请输入一个整数12 任务执行完成 中断标志位true