线程池自由编程:水池放水。线程池未正确停止。
问题描述:
暂停放水后依然输出正常放水
相关代码:
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("停水正常,水池没水了");
}
}
}
最后输出:
正在放水
停水正常,水池没水了
正在放水
正在放水
21
收起
正在回答
1回答
同学你好,同学的代码有如下地方需要优化一下
1、这里不会将报错信息进行打印,另外,强制停水的输出语句在后面代码中书写了,这里也无需再次打印
2、这里判断应该是当isWater为true时水池是没有水了,所以应该在if语句中输出水池没有水
3、输出剩余水的数量应该是集合中剩余水的数量,修改如下
祝学习愉快~
祝学习愉快~
java工程师2020版
- 参与学习 人
- 提交作业 9401 份
- 解答问题 16556 个
综合就业常年第一,编程排行常年霸榜,无需脱产即可学习,北上广深月薪过万 无论你是未就业的学生还是想转行的在职人员,不需要基础,只要你有梦想,想高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星