java线程池中正在执行的线程彻底停止

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java线程池中正在执行的线程彻底停止相关的知识,希望对你有一定的参考价值。

在终止线程池的时候,正在运行的线程不会终止.调用的是shutdownnow()没错啊
private static ExecutorService pool = Executors.newSingleThreadExecutor();
pool.shutdownnow();

shutdownnow()只是会尝试着结束正在运行的线程任务,如同调用Future的cancel方法,但是不保证一定能结束线程。 参考技术A 可以试一下pool.shutdown(); 参考技术B 请另请高手 参考技术C 为了答题~

Android中的线程池

参考技术A  线程池的好处

1、重用线程池中的线程,避免线程的创建与销毁带来的性能开销

2、能有效控制线程池的最大并发数,避免大量线程因抢占资源而导致的阻塞

3、能对线程进行简单的管理,提供定时或者指定间隔时间、循环执行等操作

线程池的概率来自于java的Executor接口,实现类是ThreadPoolExecutor, 它提供一系列的参数来配置线程池,以此构建不同的线程池。Android的线程池分4类,都是通过Executors所提供的工厂方法来得到。

ThreadPoolExecutor有四个构造函数,下面这个是最常用的

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnnable> workQueue, ThreadFactory threadFactory)

corePoolSize

线程池中的核心线程数,默认情况下核心线程会在线程池中一直存活,即使他们处于闲置状态。如果设置ThreadPoolExecutor 中的allowCoreThreadTimeOut = true, 核心线程在等待新任务到来时有超时机制,时间超过keepAliveTime所指定的时间后,核心线程会终止。

maximumPoolSize

最大线程数

keepAliveTime

非核心线程闲置的超时时间,超过这个时间,非核心线程会被回收。核心线程则要看allowCoreThreadTimeOut属性的值。

unit

时间单位

workQueue

线程池中的工作队列

threadFactory

线程工厂,为线程池提供创建新线程的功能。

举个例子,我们常用的okhttp内部也是使用了线程池,它的ThreadPoolExecutor主要是定义在Dispatcher类里面。 使用的是CachedThreadPool。

executorService = ThreadPoolExecutor(0, Int.MAX_VALUE, 60, TimeUnit.SECONDS, SynchronousQueue(), ThreadFactory("okhttp Dispatcher", false))

1、FixedThreadPool

通过Executors的newFixedThreadPool()创建,这是一个线程数量固定的线程池,里面所有的线程都是核心线程。

public static ExecutorService newFixedThreadPool(int nThreads)

return new ThreadPoolExecutor(nThreads, nThreads, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())



2、CachedThreadPool

通过Executors的newCacheThreadPool()创建,这是一个线程数量不定的线程池,里面所有的线程都是非核心线程。最大线程数是无限大,当线程池中的线程都处于活动状态时,新的task会创建新的线程来处理,否则就使用空闲的线程处理,所有的线程都是60s的超时时间,超时后会自动回收。

public static ExecutorService newFixedThreadPool()

return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>())



3、ScheduledThreadPool

通过Executors的newScheduledThreadPool()创建, 核心线程固定,非核心线程无限大,当非核心线程空闲时,会立即被回收。适合做定时任务或者固定周期的重复任务。

public static ExecutorService newScheduledThreadPool(int corePoolSize)

return new ThreadPoolExecutor(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.SECONDS, new DelayedWorkQueue())



4、SingleThreadExcecutor

通过Executors的newSingleThreadPool()创建,内部只有一个核心线程。

public static ExecutorService newFixedThreadPool()

return new ThreadPoolExecutor(1, 1, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())



课外知识:LinkedBlockingQueue

LinkedBlockingQueue是由链表组成的阻塞队列,内部head 指向队列第一个元素,last指向最后一个元素。入队和出队都会加锁阻塞,都是使用了不同的锁。

DelayedWorkQueue

延时队列,队内元素必须是Delayed的实现类。对内元素会按照Delayed时间进行排序,对内元素只有在delayed时间过期了才能出队。

入队的时候不阻塞队列,出队的时候,如果队列为空或者队列里所有元素都等待时间都没有到期,则该线程进入阻塞状态。

以上是关于java线程池中正在执行的线程彻底停止的主要内容,如果未能解决你的问题,请参考以下文章

Android中的线程池

正确关闭线程池:shutdown 和 shutdownNow 的区别

停止线程池的正确方法

c# 怎么等待线程池中所有线程都运行结束在运行主线程

c#线程停止

如何正确停止线程