线程池关闭方法和线程池拒绝策略

目录

ExecutorService对象的shutdown()和shutdownNow()的区别?

线程池的拒绝策略

java中断线程方式


ExecutorService对象的shutdown()和shutdownNow()的区别?

shutdown只是将线程池的状态设置为SHUTWDOWN状态,正在执行的任务会继续执行下去,没有被执行的则中断。而shutdownNow则是将线程池的状态设置为STOP,正在执行的任务则被停止,没被执行任务的则返回。

线程池的拒绝策略

 ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。

ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。

ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务

ThreadPoolExecutor.CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务

 线程池中默认的拒绝策略:ThreadPoolExecutor.AbortPolicy。

java中断线程方式

方式一:stop()方法

该方法在目前JDK版本标记为过时的方法,该方法线程不安全,调用该方法线程立即停止,可能导致部分线程逻辑未执行。

方法二:使用interrupt()中断线程

interrupt()方法并不像在for循环语句中使用break 语句那样干脆,马上就停止循环。调用interrupt ()方法仅仅在当前线程中打一个停止的标志,并不是真的停止线程。

当调用interrupt()方法中断线程时,中断线程并不会立即终止线程,而是通知目标线程,有人希望你终止。至于目标线程收到通知后会如何处理,则完全由目标线程自行决定。这一点很重要,如果中断后,线程立即无条件退出,那么我们又会遇到stop()方法的老问题。

要停止线程的话,需要用到Thread.isInterrupted()和Thread.interrupted()方法

Thread.isInterrupted() 判断是否中断。

Thread.interrupted() 判断是否被中断,并清除当前中断状态。

3、使用标志位停止线程

    //volatile 修饰符用来保证其他线程读取的总是该变量的最新的值
    public volatile boolean exit=false;

    @SneakyThrows
    @Override
    public void run(){
        ServerSocket serverThread=new ServerSocket(8080);
        while (!exit){
            serverThread.accept();//阻塞等待客户端消息
        }
    }

    public static void main(String[] args){
        ServerThread t=new ServerThread();
        t.start();
        t.exit=true;//修改标志位,退出线程
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值