`
yaozhiqiang109
  • 浏览: 119714 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

多线程 (2) ThreadPoolExecutor 介绍和 FutureTask使用

    博客分类:
  • JAVA
阅读更多

FutureTask是一种可以取消的异步的计算任务。它的计算是通过Callable实现的,并且有三个状态:等待、运行和完成。完成包括所有计算以任意的方式结束,包括正常结束、取消和异常。

 

 

V 	get()
          如有必要,等待计算完成,然后检索其结果。
 V 	get(long timeout, TimeUnit unit)
          如有必要,最多等待为使计算完成所给定的时间之后,检索其结果(如果结果可用)。
 

Executor框架利用FutureTask来完成异步任务,并可以用来进行任何潜在的耗时的计算。一般FutureTask多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。

 

 

public class TestFutureTask {

    /**
     * @param args
     * @create_time 2011-6-24 下午03:41:57 
     */
    public static void main(String[] args) {
        //创建线程池
        ThreadPoolExecutor pool=new ThreadPoolExecutor(3,3,2,TimeUnit.SECONDS,
                new ArrayBlockingQueue<Runnable>(10),new ThreadPoolExecutor.AbortPolicy());
        List<FutureTask<String>>  tasks=new ArrayList<FutureTask<String>>();
        for(int i=0;i<10;i++){
            FutureTask<String> futureTask=new FutureTask<String>(new ThreadPoolTask(i));
            pool.submit(futureTask);
            tasks.add(futureTask);
        }
        for (FutureTask<String> futureTask : tasks) {
            try {
                //阻塞一直等待执行完成拿到结果
                System.out.println("future result:"+futureTask.get());
                //阻塞一直等待执行完成拿到结果,如果在超时时间内,没有拿到则抛出异常
//                System.out.println("future result:"+futureTask.get(1,TimeUnit.SECONDS));
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            } //捕获超时异常
//            catch (TimeoutException e) {
//                e.printStackTrace();
//            }
        }
    }
    /**
     * 执行业务计算
     * 
     * @date 2011-6-24
     * Copyright (C) 2010-2012 www.2caipiao.com Inc. All rights reserved.
     */
    public static class ThreadPoolTask implements Callable<String>{

        private int value;
        
        public ThreadPoolTask(int value){
            this.value=value;
        }
        @Override
        public String call() throws Exception {
            //计算
            System.out.println("value-----"+value++);
            Thread.sleep(2000);
            return String.valueOf(value);
        }
        
    }
}
 

 

线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:

 

 

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
 
 
corePoolSize: 线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
keepAliveTime: 线程池维护线程所允许的空闲时间
unit: 线程池维护线程所允许的空闲时间的单位
workQueue: 线程池所使用的缓冲队列
handler: 线程池对拒绝任务的处理策略
 

 

 

 

当一个任务通过execute(Runnable)方法欲添加到线程池时:
 
  如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
  如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
  如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
  如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
  当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。
 
unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:
NANOSECONDS、
MICROSECONDS、
MILLISECONDS、
SECONDS。
 

 

 

workQueue常用的是:java.util.concurrent.ArrayBlockingQueue
 
handler有四个选择:
ThreadPoolExecutor.AbortPolicy()
抛出java.util.concurrent.RejectedExecutionException异常
 
ThreadPoolExecutor.CallerRunsPolicy()
重试添加当前的任务,他会自动重复调用execute()方法
 
ThreadPoolExecutor.DiscardOldestPolicy()
抛弃旧的任务
 
ThreadPoolExecutor.DiscardPolicy()
抛弃当前的任务
 

 


1
0
分享到:
评论

相关推荐

    spring线程池ThreadPoolExecutor配置以及FutureTask的使用

    在Java的多线程编程中,Spring框架提供了一种便捷的方式来管理和配置线程池,这就是`ThreadPoolTaskExecutor`。这个类是Spring对Java内置的`java.util.concurrent.ThreadPoolExecutor`的封装,允许开发者在Spring...

    Java多线程的总结

    多线程允许程序同时执行多个任务,提高了系统资源的利用率,提升了应用程序的响应速度和并发性能。对于大型分布式系统、Web应用以及任何需要处理大量并发请求的服务来说,深入理解和熟练掌握Java多线程是必要的。 ...

    Java多线程.pdf

    Java多线程是Java编程中一个非常重要的概念,它允许程序在同一时间执行多个任务,从而提高了应用程序的效率和响应速度。在操作系统中,程序被加载到内存中形成进程,而进程中的执行单元就是线程。Java多线程的实现...

    Android多线程操作

    标题"Android多线程操作"和描述"Android多线程开发实例,对使用多线程的用户有一定的参考价值!"暗示我们将深入探讨Android中的线程管理以及如何在实践中有效利用。 Android系统默认运行在主线程,也被称为UI线程,...

    断点多线程下载.

    Android提供了多种多线程解决方案,如AsyncTask、Handler、Looper、Thread和ThreadPoolExecutor等。在这个项目中,可能使用了AsyncTask或者自定义的线程池来实现多线程下载。 其次,断点续传是下载过程中的一种优化...

    java多线程、锁的教程跟案例

    在Java中,多线程允许程序同时执行多个任务,提高CPU的利用率,而锁则是用来控制多线程间共享资源的访问,确保数据的一致性和完整性。 一、Java多线程 1. **线程创建方式** - 继承Thread类:自定义类继承Thread类...

    JAVA 多线程学习笔记

    在Java编程中,多线程是一项关键技能,它允许程序同时执行多个任务,提升系统效率。这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及...结合源码分析和实际工具的使用,将使我们成为Java多线程领域的专家。

    多线程concurrent的用例

    这个"多线程concurrent的用例"压缩包中很可能包含了一些示例代码,帮助我们理解和实践如何在Java中使用这些并发工具。 在Java中,创建线程主要有两种方式:继承`Thread`类和实现`Runnable`接口。`concurrent`包提供...

    Java多线程编程核心技术.zip

    在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。本资料"Java多线程编程核心技术.zip"深入探讨了这些核心技术,并提供了源码供学习者实践和理解。 1. **线程的创建与启动** - 继承Thread类...

    JAVA多线程设计模式 书和源码

    Java提供了许多线程安全的集合类,如`ConcurrentHashMap`、`CopyOnWriteArrayList`和`Atomic*`类,这些类内部实现了线程安全的算法,便于在多线程环境中使用。 五、线程局部变量 `ThreadLocal`类允许每个线程拥有...

    java多线程案例——未完成

    Java多线程是Java编程中的一个重要领域,它允许程序同时执行多个任务,从而提高系统效率和资源利用率。在这个未完成的案例中,我们可能正在探讨如何在Java中创建和管理线程,以及处理多线程环境下的并发问题。下面是...

    Java多线程文档

    在IT领域,尤其是在Java编程中,多...这篇文档通过深入浅出的方式讲解了Java多线程编程的核心概念、常用工具和最佳实践,对于理解和应用Java多线程有着极大的帮助。无论是初学者还是有经验的开发者,都能从中受益匪浅。

    java多线程面试题59题集合

    在面试中,对Java多线程的理解和熟练运用往往成为衡量开发者技能水平的重要标准。以下是对Java多线程面试题59题集合中可能涉及的一些关键知识点的详细解析。 1. **线程的创建方式** - 继承Thread类:创建一个新的...

    Android 多线程的操作方式代码

    在Android开发中,多线程是一项至关重要的技术,它允许应用程序在不同的线程上执行任务,从而提高程序的响应速度和用户体验。本文将深入探讨Android中实现多线程的几种常见方式,以及如何通过代码来操作多线程。 1....

    Java多线程干货系列(1)Java多线程基础编程开发技术

    本系列的第1部分将重点介绍Java多线程的基础编程开发技术,旨在帮助开发者掌握多线程的核心概念和实用技巧。 1. **线程的概念**: 线程是操作系统调度的基本单位,它代表了程序执行的流程。在一个进程中可以有多个...

    热门Java面试多线程面试题问答Top50共17页.pdf

    【标题】"热门Java面试多线程面试题问答Top50共17页.pdf" 提供了一份关于Java多线程面试的重要资源,涵盖了面试中可能会遇到的50个关键问题和答案,共计17页。这表明该文档深入探讨了Java编程中的并发处理和线程管理...

    Java 多线程学习总结6

    在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了系统的并发性和效率。在“Java多线程学习总结6”这个主题中,我们可以深入探讨Java多线程的实现、管理及优化。下面将详细阐述相关...

    android下多线程示例代码

    在Android平台上,多线程是实现程序并发执行的关键技术,特别是在UI交互和后台任务处理上。本示例代码旨在帮助开发者深入理解并掌握在Android环境中如何有效地使用多线程。以下将详细介绍这5种不同的线程实现方式...

    Java线程池FutureTask实现原理详解

    Java线程池FutureTask实现原理详解是Java多线程编程中的一种重要机制,用于追踪和控制线程池中的任务执行。下面将详细介绍FutureTask的实现原理。 类视图 为了更好地理解FutureTask的实现原理,我们需要了解一些...

    Java多线程实现的四种方式

    在Java中,实现多线程有四种主要方法:继承Thread类、实现Runnable接口、使用ExecutorService和使用Callable与Future。下面将详细探讨这四种方式。 1. 继承Thread类 在Java中,我们可以直接继承Thread类并重写其run...

Global site tag (gtag.js) - Google Analytics