3-13自由编程报错

3-13自由编程报错

package thread;

import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;

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

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

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

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

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


    private final ReentrantLock lock = new ReentrantLock();

    private Condition unpaused = lock.newCondition();

    private boolean isPaused;

    @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();
        }

    }

    public void pause() {
        lock.lock();
        try {
            isPaused = true;
        } finally {
            lock.unlock();
        }
    }

    public void resume() {
        lock.lock();
        try {
            isPaused = false;
            //唤醒
            unpaused.signalAll();
        } finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        MyTestThreadPool myTestThreadPool = new MyTestThreadPool(
                10, 20, 10l, TimeUnit.SECONDS, new LinkedBlockingQueue<>()
        );

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("正在放水");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        System.out.println("开始上班,往水池放1000吨水");
        for (int i = 0; i < 1000; i++) {
            myTestThreadPool.execute(runnable);
        }
        Thread.sleep(2000);
        myTestThreadPool.pause();
        int num = myTestThreadPool.getQueue().size();
        System.out.println("暂停放水");
        System.out.println("中午回家吃饭,暂停放水,还剩" + num + "吨水");
        Thread.sleep(2000);
        myTestThreadPool.resume();
        System.out.println("下午上班,开始放水");
        Thread.sleep(2000);
        myTestThreadPool.shutdown();
        boolean shutdown = myTestThreadPool.isShutdown();
        if (shutdown) {
            System.out.println("五点了开始停水 10后强制停水开始停水");
        }
        boolean awaitTermination = myTestThreadPool.awaitTermination(5, TimeUnit.SECONDS);
        if (awaitTermination) {
            System.out.println("停水成功 水池没水了");

        } else {
            System.out.println("启动强制停水");
            List<Runnable> runnables = myTestThreadPool.shutdownNow();
            System.out.println("还剩" + runnables + "吨水");

        }
    }
}

https://img1.sycdn.imooc.com//climg/637df6070933604c08800641.jpg

请问老师这里为什么会报错呀

正在回答 回答被采纳积分+1

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

1回答
好帮手慕小蓝 2022-11-23 18:33:56

同学你好,任务如果没有执行完成而被打断时会抛出InterruptedException。

而shutdownNow()方法会强制关闭所有未完成的任务并且关闭线程池,恰好满足了上述的要求,所以当调用shutdownNow()方法时如果有正在执行的任务就会抛出异常。

这里抛出这个异常是正常的。

祝学习愉快~

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

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

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

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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