目录
ExecutorService对象的shutdown()和shutdownNow()的区别?
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;//修改标志位,退出线程
}