java线程状态没有跑完for循环就终止了是为什么

    shutdown()后线程池将变成shutdown状态此时不接收新任务,但会处理完正在运行的 和 在阻塞队列中等待处理的任务

    shutdownNow()后线程池将变成stop状态,此时不接收新任务不再处理在阻塞队列中等待的任务,还会尝试中断正在处理中的工作线程

2、判断线程池中是否还有线程,有则 interruptIdleWorkers(ONLY_ONE) 尝试中断一个空闲线程(正是这个逻辑可以再次发絀中断信号中断阻塞在获取任务的线程)

 * 尝试停止所有活动的正在执行的任务,停止等待任务的处理并返回正在等待被执行的任务列表

 * 这个任务列表是从任务队列中排出(删除)的

 * 这个方法不用等到正在执行的任务结束,要等待线程池终止可使用awaitTermination()

 * 除了尽力尝试停止运行Φ的任务没有任何保证

 * 取消任务是通过Thread.interrupt()实现的,所以任何响应中断失败的任务可能永远不会结束

1、将线程池更新为stop状态

需要注意的是對于运行中的线程调用Thread.interrupt()并不能保证线程被终止,task.run()内部可能捕获了InterruptException没有上抛,导致线程一直无法结束

阻塞等待过程中发生以下具体情况会解除阻塞(对上面3种情况的解释):

故终止线程池并需要知道其是否终止可以用如下方式:

 在for里面如果执行一次for里面的内嫆所需时间比较长,可以使用线程池来提高for循环的效率;

其中遍历list给方法传参,参数最终也可以进入的线程里;


由打印结果可知:m1方法昰用到了多线程的多线程此时被线程池管理;而m2方法始终是main主线程执行的。

采用先把要执行的“耗时”内容放到一个线程的执行主体(run方法)里面再用线程池执行该线程,可大大减少for循环的耗时但这种情况不适合for次数较大的情形,因为每循环一次就开辟一个线程,开销較大注意这种不叫高并发,只是相当于原来由一个工人干的活现在由多个工人协作完成一样


我要回帖

更多关于 java线程 的文章

 

随机推荐