线程池

来源:互联网 发布:python特点 编辑:程序博客网 时间:2024/06/01 07:20

线程池

由于系统启动一个线程的成本是比较高,线程池也就应运而生。

线程池在系统启动时创建大量空闲线程,将Runnable、Callable对象—–>传给线程池—–>线程池会启动里面的线程执行他们的线程执行体(run()或者call()方法)———->当线程执行体执行完成后,线程并不会死亡,而是返回在此成为空闲状态,等待下一次执行。

线程池对象创建

利用Executor工厂类来产生线程池:

        newCachedThreadPool():创建一个具有缓存功能的线程池,系统根据需要创建线程,线程会缓存在线程池中        newFixedThreadPool(int nThreads):创建一个可重用的、nThread个固定的线程的线程池        newSingleThreadExecutor():创建包含一个线程的线程池,相当于上面那个法中参数为1时。        newScheduledThreadPool(int corePoolSize):指定线程数量的线程池,可以在指定延迟后执行线程任务        newSingleThreadScheduledExecutor():创建单个线程的线程池,可以指定延迟后执行

注意:

  1. 前三个方法返回ExecutorService对象,该对象代表一个线程池,他可以执行Runnable和Callable对象代表的线程,后两个方法返回ScheduledExecutorService,他是ExecutorService的子类
  2. ExecutorService只要线程池中有空闲线程就立刻执行线程任务而ScheduledExecutorService可以在指定延迟或周期性的执行

ExecutorService的API

Future<?> submit(Runnable task):将一个Runnable对象提交给指定线程池,线程池有空闲线程是就立即执行,***Future代表Runnable任务的返回值***,但run()方法没有返回值,所以Future将在Run()结束后返回null.可以通过Future的isDone()、isCancelled()来获取Runnable对象的执行状态<T>Future<T> submit(Runnable task,T result):result显示指定线程结束后的返回值,所以Future对在run()结束后返回result<T>Future<T> submit(Callable<T> task):讲一个Callable对象提交给线程池,程池将在有空闲线程是执行,Future代表call()方法的返回值

ScheduledExecutorService相关API

            SCheduledFuture<V> schedule(Callable<V> callable,long delay,TimeUnit unit):指定callable任务将在delay延迟后执行scheduleFuture<?> schedule(Runnable command ,long delay,TimeUnit unit):指定在delay延迟后执行ScheduledFuture<?> scheduleAtFixedRate(Runnable command,long initDelay,long period,TimeUnit unit):指定任务将在initDelay后开始执行,并以period为周期重复执行AcheduledFuture<?> scheduleWithFixedDelay(Runnable command,long iniDelay,long delay,TimeUnit unit):在指定***初始延迟***后首次启动的定期操作,随后在每一次执行完后和下一次开始之间都存在delay延迟。如果任意一次执行遇到异常,就会取消后续执行,否则,只能通过持续显示取消或终止该任务

当一个线程池使用完之后,应该调用线程池的shutdown(),以将启动的线程池序列关闭,调用shutdown()后,线程池将不再接收新的任务,但会将以前提交的任务执行完。当线程池中的任务全部执行完之后,线程池中所有线程就会死亡

  • shutdownNow()方法:关闭线程池,停止所有正在执行的活动任务,暂停正在等待的任务,并返回等待任务执行的任务列表

线程池执行线程流程

  1. 创建Ececutor类的静态工厂方法创建一个ExecutorService(线程池对象)
  2. 创建Runnable或者Callable实例,作为线程执行任务
  3. 调用线程池的submit()提交任务
  4. 当不想提交任何任务时,调用ExecutorService对象的shutdown()关闭线程池
0 0
原创粉丝点击