线程池自由编程:水池放水。线程池未正确停止。

线程池自由编程:水池放水。线程池未正确停止。

问题描述:

暂停放水后依然输出正常放水

相关代码:

package threadpool;

import java.util.concurrent.*;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class PauseableWaterPool extends ThreadPoolExecutor {

private boolean isPaused;
private final ReentrantLock lock = new ReentrantLock();
private Condition unpaused = lock.newCondition();

public PauseableWaterPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}

public PauseableWaterPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
}

public PauseableWaterPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);
}

public PauseableWaterPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
}
@Override
protected void beforeExecute(Thread t,Runnable r){
super.beforeExecute(t, r);
lock.lock();
try {
while (isPaused) {
unpaused.await();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
private void pause() {
lock.lock();
try {
isPaused = true;
} finally {
//释放锁
lock.unlock();
;
}
}

public void resume(){
lock.lock();
try {
//唤醒全部
isPaused=false;
unpaused.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
PauseableWaterPool pauseableWaterPool = new PauseableWaterPool(1, 1, 10, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("正在放水");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
System.out.println("启动强制停水");
e.printStackTrace();
}
}

};
System.out.println("上班,水池放入1000吨水");
for (int i = 0; i < 50; i++) {
pauseableWaterPool.execute(runnable);
}
Thread.sleep(200);
pauseableWaterPool.pause();
System.out.println("中午,水池被暂停。还剩" + pauseableWaterPool.getQueue().size() + "吨水");
System.out.println("暂停放水");
Thread.sleep(200);
pauseableWaterPool.resume();
System.out.println("下午,水池开始放水");
Thread.sleep(200);
pauseableWaterPool.shutdown();
System.out.println("下午6点,开始停水,10s内强制停水");
if(pauseableWaterPool.isShutdown()){
System.out.println("开始停水正常");
}
boolean isWater = pauseableWaterPool.awaitTermination(100, TimeUnit.MILLISECONDS);
if(isWater){
pauseableWaterPool.shutdownNow();
System.out.println("启动强制停水");
System.out.println("水池还剩" + pauseableWaterPool.getQueue().size() + "吨水");
}else{
System.out.println("停水正常,水池没水了");
}
}
}

最后输出:

正在放水

停水正常,水池没水了

正在放水

正在放水


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,同学的代码有如下地方需要优化一下

1、这里不会将报错信息进行打印,另外,强制停水的输出语句在后面代码中书写了,这里也无需再次打印

http://img1.sycdn.imooc.com//climg/6099eb3809b274f305310183.jpg

2、这里判断应该是当isWater为true时水池是没有水了,所以应该在if语句中输出水池没有水

3、输出剩余水的数量应该是集合中剩余水的数量,修改如下

http://img1.sycdn.imooc.com//climg/6099eb7909ac806d08130195.jpg

祝学习愉快~

祝学习愉快~

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师